HQL选择当外键为空时,新的不返回行

时间:2015-11-15 14:56:44

标签: spring hibernate hql spring-data jpql

我有以下命名查询

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

1 个答案:

答案 0 :(得分:0)

问题可能是uf.flight.divertedAirport。此表达式在flightdivertedAirport之间执行加入,但正如您所说,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 useruser.id),因为它更易读,而且产生问题的这类问题更容易找到这种方式来编写JPQL查询。