您好我有一个带有hibernate注释的简单产品Pojo。
Class Product
Product ID
name
title
make
colors (1..*) lazy
我是否知道有没有办法在单行文本中只获取productID,名称和颜色?
示例:
name: "Monitor"
colors: "Green; Red; Blue;"
原因:用户需要5000个列表的列表,它只需要名称并列出字段中的颜色。
Hibernate将需要1个查询(前5000个)+ 5000个查询(颜色)来获取数据。我希望只在1个查询中得到它。
使用:休眠标准
ADD ON:我设置了criteria.maxResult(5000),当我使用FetchMOdel.JOIN时(Criteria.DISTINCT_ROOT_ENTITY);它为我提供了不到5000个完整的结果,这是因为每个“颜色”都会连续返回..
答案 0 :(得分:2)
执行以下查询,使用连接提取,因此将使用产品加载颜色:
select distinct product from Product product
left join fetch product.colors color
where ...
中有详细描述
“fetch”连接允许值的关联或集合 使用单个选择与其父对象一起初始化。 这在集合的情况下特别有用。它 有效地覆盖了外连接和延迟声明 关联和集合的映射文件。
使用条件进行操作是类似的(只是更乏味:只有当where子句真的是动态的时才这样做):
Criteria c = session.createCriteria(Product.class, "product");
c.setFetchMode("product.colors", FetchMode.JOIN);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.add(...);
这是the documentation的相关部分:
您可以使用在运行时指定关联提取语义 调用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个元素的集合,并为每个分区执行查询。
答案 1 :(得分:0)
你的数据库是什么?
您可以在实体中使用colorsText
注释定义@Formula('...')
。但是你应该编写一个查询,为每一行返回一个字符串。
在大多数数据库中都有某种concatenate
聚合函数,只需找到数据库的函数。