Hibernate join fetch 带有连接右侧的条件

N.Z*_*ski 1 hibernate join inner-join

我有以下用 HQL 编写的命名查询:

query = "select u from User u " +
   "join fetch u.devices d " +
   "join fetch u.ipRestrictions ir " +
   "join fetch u.employees e where " +
   "u.login = :login and " +
   "u.enumDataState.id = :dataStateId and " +
   "d.enumDataState.id = :dataStateId and " +
   "ir.enumDataState.id = :dataStateId and " +
   "e.enumDataState.id = :dataStateId ")
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我传递了一个电子邮件和 dataStateId 值。我可以在数据库表中看到,有一个用户具有给定的电子邮件和 dataStateId,但我没有得到任何结果。

查询的目的是join fetch使用给定电子邮件的活动用户(dataStateId 告诉用户是否活动),其中设备、ipRestrictions 和员工也处于活动状态。

我已经在 stackoverflow 上看到了一些答案,有些建议使用,left join fetchleft join fetch也没有用。

我确信有一个用户具有给定的电子邮件和给定的 dataStateId,因为我可以在数据库数据编辑器中看到他。

我怎么能在这里解决这个问题?这是一个巨大的问题,因为我将有很多这样的功能,我需要检查join fetch使用某些条件的右侧。

我正在使用 Hibernate v5.2。

war*_*gre 5

根据您的评论,您应该使用:

select u from User u
    left join fetch u.devices d 
    left join fetch u.ipRestrictions ir
    left join fetch u.employees e 
where 
    u.login = :login and u.enumDataState.id = :dataStateId and 
    (d is null or d.enumDataState.id = :dataStateId) and 
    (ir is null or ir.enumDataState.id = :dataStateId) and
    (e is null or e.enumDataState.id = :dataStateId)
Run Code Online (Sandbox Code Playgroud)

注意:is null可能不起作用(取决于 JPA 版本和实现)。您可能需要使用

  • u.devices 为空
  • u.devices 为空