【问题标题】:HQL Select New doesn't return row when a foreign key is null当外键为空时,HQL Select New 不返回行
【发布时间】:2016-02-16 16:59:12
【问题描述】:

我有以下命名查询

@NamedQuery(name = "UserFlight.getUserFlightDetails", 
query = "SELECT new com.foobar.UserFlightDetails(uf.flight.divertedAirport, uf.flight.number) " +
        "FROM UserFlight uf WHERE uf.user.id=?1 AND uf.flight.id=?2")

UserFlightDetails构造函数如下

public UserFlightDetails(Airport airport, String flightNumber) {
    this.setDivertedAirport(airport);
    this.setFlightNumber(flightNumber);
}

divertedAirportflight表中的外键,path=(uf.flight.divertedAirport)

我的问题是当divertedAirport 为空(它是一个可以为空的外键)时,我的 HQL 查询返回 null 作为结果(代码甚至没有触发上面的构造函数),所以我没有得到 flightNumber永远不会为空。

如果divertedAirport 不为空,我可以得到机场和航班号(并且上面的构造函数执行得很好)。

这可能是什么原因造成的,我该如何解决?我尝试了一些空函数,例如 nullifcoalesce,但没有任何帮助。

我使用的是 spring boot 1.2.7,hibernate-core 4.3.11.Final

【问题讨论】:

    标签: spring hibernate hql spring-data jpql


    【解决方案1】:

    问题可能出在uf.flight.divertedAirport。此表达式在 flightdivertedAirport 之间进行 JOIN,但正如您所说,divertedAirport 是 fk 并且可以为空。

    因此,您需要使用LEFT JOIN

    我会这样重写你的查询:

    @NamedQuery(name = "UserFlight.getUserFlightDetails", 
    query = 
    "SELECT new com.foobar.UserFlightDetails(divertedAirport, flight.number) 
    FROM UserFlight uf 
    JOIN uf.flight flight
    LEFT JOIN flight.divertedAirport divertedAirport
    JOIN uf.user user
    WHERE user.id = ?1 AND flight.id = ?2 ")
    

    对于显式 JOIN(JOIN uf.user user 加上 user.id),我删除了像 uf.user.id 这样的引用,因为它更易读,并且使用这种方式编写 JPQL 查询更容易找到产生您的问题的此类问题.

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 2018-11-04
      • 2011-11-26
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多