【发布时间】:2012-04-01 00:05:13
【问题描述】:
我正在使用 HQL 查询来获取某些记录。如果我使用LEFT JOIN FETCH,目标实体中的集合将包含重复记录。如果我只使用左连接,它不会。我猜当 Hibernate 懒加载记录时,它会避免重复。
"SELECT z FROM ", TableA.TABLE_NAME, " z ", //
"LEFT JOIN FETCH z.attributeX pv ", //
"LEFT JOIN FETCH pv.attributeY anteil ", //
"LEFT JOIN FETCH z.attributeB kma ", //
"LEFT JOIN FETCH kma.attributeC ", //
"WHERE anteil.attributeD.attributeE.id = :eId ", //
"AND pv.attributeG.id = :gId ");
我的实体TableA 有一个指向TablePV (LEFT JOIN FETCH z.attributeX pv) 的链接
TablePV 拥有TableY (LEFT JOIN FETCH pv.attributeY anteil) 的集合
现在 Hibernate 将正确映射除 TablePV 的孩子之外的所有内容。它将包含多次相同的记录。 TableA 上的不同没有帮助,因为那里没有重复项。我可以手动删除那些我猜会非常糟糕的记录。
【问题讨论】:
-
使用集合作为您的收藏。
-
AFAIK LEFT JOIN FETCH 和对它的限制是互斥的,因为限制可能会过滤掉集合中的元素以获取急切。也许你这里有不同的根本原因
-
感谢您的回答。一个 Set 将解决问题,但它是一种变通方法,并且会产生其他问题(例如排序)。我不知道这是否是互斥的,因为这种情况是有道理的。我希望在同一个查询中获取记录,而不是使用另一个 select 语句。如果我只使用没有 FETCH 的 LEFT JOIN,就会发生这种情况。
-
Set 如何删除集合属性中的重复对象?!
-
了解 LEFT JOIN 返回的内容:INNER JOIN 行加上由 NULL 扩展的不匹配的左表行。作为 LEFT JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT JOIN ON 删除任何由 NULL 扩展的行之后,需要右表列不为 NULL 的 WHERE 或 INNER ON,即只留下 INNER JOIN 行,即“将 LEFT JOIN 转换为 INNER JOIN”。你有那个。
标签: hibernate jpa hql left-join fetch