如何在休眠中限制对象属性中的集合?

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();

【讨论】:

这只限制“项目”而不是“出价”!

以上是关于如何在休眠中限制对象属性中的集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何对List集合中的对象进行按某个属性排序

如何创建集合扩展以在具有属性的集合中查找唯一对象?

如何避免警告“使用集合提取指定的 firstResult/maxResults;在内存中应用!”啥时候使用休眠?

如何在休眠/弹簧中更新多对多集合(延迟加载)?

休眠保存或更新行为

休眠:分离没有级联到集合