使用 join fetch 执行以下查询,从而将颜色与产品一起加载:
select distinct product from Product product
left join fetch product.colors color
where ...
HQL 在Hibernate 文档中有很好的描述:
“获取”连接允许使用单个选择来初始化值的关联或集合以及它们的父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部连接和惰性声明。
用标准来做是相似的(只是更乏味:只有当 where 子句真的是动态的时候才这样做):
Criteria c = session.createCriteria(Product.class, "product");
c.setFetchMode("product.colors", FetchMode.JOIN);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.add(...);
这是文档的相关部分:
您可以使用 setFetchMode() 在运行时指定关联获取语义
你已经在这里问了很多 Hibernate 问题。你为什么不阅读文档?
编辑:
从评论中,您似乎知道如何做您想做的事,但是您在应用最大数量的结果时遇到了问题。
这个问题最简单的解决方案是执行第一个查询,限制为 5000,只加载产品的 ID。然后执行第二个查询,不限于,加载产品及其颜色,在第一个查询检索到的 ID 集中有一个 ID:
select product.id from Product product where ...
select distinct product from Product product
left join fetch product.colors color
where product.id in (:productIds)
请注意,某些数据库(例如 Oracle)会限制您可以在IN
子句中放入的元素数量(Oracle 最多 1000 个元素)。因此,您可能必须将 5000 个 ID 的集合划分为 1000 个元素的集合,并对每个分区执行查询。