Как ограничить коллекцию в свойстве объекта в спящем режиме?

1

У меня есть два объекта: item и bid, у каждого элемента есть много ставок для него, поэтому ставка - это свойство коллекции элемента.

на странице, показывающей элемент, я просто хочу показать первые 10 записей ставок по этому "элементу".

поэтому, я делаю этот запрос:

from item
left join fetch item.bids
where item.id=3
...

но это будет получать все ставки по предмету, поэтому, как ограничить ставки по товару?

  • 0
    если у вас есть контроль над SQL, вы можете использовать команды LIMIT и OFFSET
  • 0
    мы можем сделать это в спящем режиме?
Показать ещё 1 комментарий
Теги:
hibernate
orm
jpa

3 ответа

4

Это работает намного лучше, если у вас также есть связь от Bid to Item.

Затем вы можете выбрать элементы и применить ограничение по лимиту:

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

В предыдущем запросе, который выбирает Item и выбирает ставки, всегда будут выбирать все элементы со всеми их ставками и применять максимальный предел результата в памяти. Это связано с тем, что Hibernate всегда должен брать всех детей, он не может дать вам частичные результаты сбора.

Выбор ребенка и присоединение к родителям - лучшая альтернатива. Это ограничение распространяется на выбранных детей без каких-либо ограничений.

  • 0
    умная! благодарю вас!
1

вы можете использовать критерии setFirstResult() и setMaxResult(). или этот пост будет полезен для вашего вопроса

пример:

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;
  • 0
    это может ограничить "товар", а не его ставку!
  • 1
    вы можете использовать аннотацию, управляемую вашей сущностью, вы можете просто поместить @Size (min = 1, max = 10) в ваши отношения один ко многим или многие ко многим
Показать ещё 3 комментария
0

Для простого 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();
  • 0
    Это только ограничивает "пункт", а не "ставки"!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню