How to limit a collection in an Object's property in hibernate?

后端 未结 3 700
离开以前
离开以前 2021-01-25 19:24

I have two entities: item, and bid, each item have many bids for it, so bid is a collection property of item.

in the page that show an item, I just want to show the firs

相关标签:
3条回答
  • 2021-01-25 19:31

    you can use criteria's setFirstResult() and setMaxResult(). or this post would be helpful for your question

    example:

    sessionFactory.getCurrentSession().createQuery("your query here").setFirstResult(0).setMaxResult(10);
    

    this will generate 10 rows of data from database

    you have use annotation driven. simply add the annotation Size to your bid object

        @OneToMany( mappedBy = "object", cascade = CascadeType.ALL)
        @Size(min=1, max=10)
        private Set<Bid>    bid;
    
    0 讨论(0)
  • 2021-01-25 19:40

    This works so much better if you also have an association from Bid to Item.

    Then you can select the items and apply the limit restriction:

    session
        .createQuery(
        "select b
        from bid b
        join fetch b.item i
        where 
            i.id=3")
        .setMaxResult(10)
        .list();
    

    Your previous query, the one selecting Item and fetching Bids will always select all items with all their bids and apply the max result limit in-memory. This is because Hibernate must always fetch all children, it can't give you partial collection results.

    Selecting the child and joining the parent is a better alternative. The restriction applies to the selected children with no restriction whatsoever.

    0 讨论(0)
  • 2021-01-25 19:49

    For plain SQL, do the following:

    Select B.*
    From item I, bid B,
    Where T.itemId = B.itemId
    Limit 10;
    

    Same can be done in case you are using hibernate, using criteria API or HQL HQL example:

    Query query = session.createQuery("from MyTable");
    query.setMaxResults(10);
    
    Criteria example: 
    session.createCriteria(Abc.class)
                        .addOrder(Order.desc("id"))
                        .setMaxResults(10)
                        .list();
    
    0 讨论(0)
提交回复
热议问题