【发布时间】:2018-01-19 03:27:57
【问题描述】:
我有以下用 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 ")
当我执行它时,我传递了一个电子邮件和 dataStateId 值。我可以在数据库表中看到,有一个具有给定电子邮件和 dataStateId 的用户,但我没有得到任何结果。
查询的目的是join fetch 活动用户(dataStateId 告诉用户是否处于活动状态)与给定的电子邮件,其中设备、ipRestrictions 和员工也处于活动状态。
我已经在 stackoverflow 上看到了一些答案,有人建议使用 left join fetch,但 left join fetch 也不起作用。
我确定有一个用户使用给定的电子邮件和给定的 dataStateId,因为我可以在数据库数据编辑器中看到他。
我该如何解决这个问题?这是一个大问题,因为我将有很多这样的功能,我需要使用某些条件检查join fetch 的右侧。
我正在使用 Hibernate v5.2。
【问题讨论】:
-
您的查询指定您正在寻找具有用户状态/设备状态/iprestriction 状态/员工状态的用户“登录”,同时处于您提供的相同状态。你确定你的数据集有这样的用户吗? (您只谈论用户和用户状态而不是其他。)
-
查询必须返回电子邮件和状态匹配的用户,以及可选的其他状态也处于活动状态的对象。因此,如果有匹配的用户但它没有任何匹配的设备,我无论如何都想获取该用户,但设备列表为空。我正在使用 join fetches 来避免 1+n 查询问题。
标签: hibernate join inner-join