如何在休眠中限制对象属性中的集合?
Posted
技术标签:
【中文标题】如何在休眠中限制对象属性中的集合?【英文标题】:How to limit a collection in an Object's property in hibernate? 【发布时间】:2014-08-01 04:59:57 【问题描述】:我有两个实体:item和bid,每个item都有很多bids,所以bid是item的集合属性。
在显示项目的页面中,我只想显示关于该“项目”的前 10 条投标记录。
所以,我做这个查询:
from item
left join fetch item.bids
where item.id=3
...
但这会获取有关某项商品的所有出价, 那么,如何限制一个项目的出价?
【问题讨论】:
如果你可以控制sql,你可以使用LIMIT和OFFSET命令 我们可以用休眠的方式做到这一点吗? 您可以使用限制。否则,如果您使用准备好的语句,您可以设置最大结果限制 【参考方案1】:如果您还具有从出价到项目的关联,则效果会更好。
然后您可以选择项目并应用限制限制:
session
.createQuery(
"select b
from bid b
join fetch b.item i
where
i.id=3")
.setMaxResult(10)
.list();
您之前的查询,即选择项目并获取出价的查询将始终选择具有所有出价的所有项目,并在内存中应用最大结果限制。这是因为 Hibernate 必须始终获取所有子节点,它不能给您部分收集结果。
选择子节点并加入父节点是更好的选择。该限制适用于选定的孩子,没有任何限制。
【讨论】:
【参考方案2】:您可以使用标准的 setFirstResult() 和 setMaxResult()。或者这篇文章对你的question有帮助
示例:
sessionFactory.getCurrentSession().createQuery("your query here").setFirstResult(0).setMaxResult(10);
这将从数据库中生成 10 行数据
您已经使用注释驱动。只需将注释尺寸添加到您的出价对象
@OneToMany( mappedBy = "object", cascade = CascadeType.ALL)
@Size(min=1, max=10)
private Set<Bid> bid;
【讨论】:
这可以限制“项目”而不是它的出价记录! 您可以在您的实体中使用注释驱动,您可以简单地将 @Size(min=1, max=10) 放入您的一对多关系或多对多关系中 如果我们可以用HQL的方式覆盖映射,那就更灵活了! 你可以参考这个link我猜【参考方案3】:对于普通 SQL,请执行以下操作:
Select B.*
From item I, bid B,
Where T.itemId = B.itemId
Limit 10;
如果您使用休眠、使用标准 API 或 HQL,也可以这样做 HQL 示例:
Query query = session.createQuery("from MyTable");
query.setMaxResults(10);
Criteria example:
session.createCriteria(Abc.class)
.addOrder(Order.desc("id"))
.setMaxResults(10)
.list();
【讨论】:
这只限制“项目”而不是“出价”!以上是关于如何在休眠中限制对象属性中的集合?的主要内容,如果未能解决你的问题,请参考以下文章