我有以下命名查询
divertedAirport
UserFlightDetails构造函数如下
flight
(uf.flight.divertedAirport)
是divertedAirport
表中的外键,path = divertedAirport
我的问题是当nullif
为空(它是一个可以为空的外键)时,我的HQL查询返回null作为结果(代码甚至没有触发上面的构造函数),所以我不要获得永远不为空的flightNumber。
如果coalesce
不为空,我可以获得机场和航班号(并且上述构造函数执行得很好)。
可能导致此问题的原因以及如何解决?我尝试了一些空函数,如reval*
和reval
,但没有任何帮助。
我使用的是spring boot 1.2.7,hibernate-core 4.3.11.Final
答案 0 :(得分:0)
问题可能是uf.flight.divertedAirport
。此表达式在flight
和divertedAirport
之间执行加入,但正如您所说,divertedAirport是fk
,可以为null。
因此,您需要使用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 ")
我删除了uf.user.id
之类的引用,以获得明确的JOIN(JOIN uf.user user
加user.id
),因为它更易读,而且产生问题的这类问题更容易找到这种方式来编写JPQL查询。