【问题标题】: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命令
  • 我们可以用休眠的方式做到这一点吗?
  • 您可以使用限制。否则,如果您使用准备好的语句,您可以设置最大结果限制

标签: java sql hibernate jpa orm


【解决方案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();
    

    【讨论】:

    • 这只限制“项目”而不是“出价”!
    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多