0

嗨,我有一个带有休眠注释的简单产品 Pojo。

Class Product
Product ID
name
title
make
colors (1..*) lazy

我可以知道有没有办法在单行文本中只获取产品 ID、名称和颜色?

例子:

name: "Monitor"
colors: "Green; Red; Blue;"

原因:用户需要 5000 个列表的列表,它只需要名称并在字段中列出颜色。

Hibernate 将需要 1 个查询(前 5000 个)+ 5000 个查询(颜色)来获取数据。我希望仅在 1 个查询中获得它。

使用:休眠标准

补充:我已经设置了 criteria.maxResult(5000) 并且当我将 FetchMOdel.JOIN 与 (Criteria.DISTINCT_ROOT_ENTITY) 一起使用时;它为我提供了不到 5000 个完整的结果,这是因为每个“颜色”都是连续返回的。

4

2 回答 2

2

使用 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 个元素的集合,并对每个分区执行查询。

于 2012-08-02T14:24:42.130 回答
0

你的数据库是什么?您可以colorsText在带有@Formula('...')注释的实体中定义 a 。但是您应该编写一个查询,它为每一行返回一个字符串。

在大多数数据库中都有某种concatenate聚合函数,只需找到您数据库的函数即可。

于 2012-08-02T14:31:37.883 回答