具体的属性我想获取/返回并返回字段中的一对多关系?

时间:2012-08-02 14:21:58

标签: java hibernate

您好我有一个带有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个完整的结果,这是因为每个“颜色”都会连续返回..

2 个答案:

答案 0 :(得分:2)

执行以下查询,使用连接提取,因此将使用产品加载颜色:

select distinct product from Product product 
left join fetch product.colors color 
where ...

HQL在Hibernate documentation

中有详细描述
  

“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聚合函数,只需找到数据库的函数。