У меня есть два объекта: item и bid, у каждого элемента есть много ставок для него, поэтому ставка - это свойство коллекции элемента.
на странице, показывающей элемент, я просто хочу показать первые 10 записей ставок по этому "элементу".
поэтому, я делаю этот запрос:
from item
left join fetch item.bids
where item.id=3
...
но это будет получать все ставки по предмету, поэтому, как ограничить ставки по товару?
Это работает намного лучше, если у вас также есть связь от Bid to Item.
Затем вы можете выбрать элементы и применить ограничение по лимиту:
session
.createQuery(
"select b
from bid b
join fetch b.item i
where
i.id=3")
.setMaxResult(10)
.list();
В предыдущем запросе, который выбирает Item и выбирает ставки, всегда будут выбирать все элементы со всеми их ставками и применять максимальный предел результата в памяти. Это связано с тем, что Hibernate всегда должен брать всех детей, он не может дать вам частичные результаты сбора.
Выбор ребенка и присоединение к родителям - лучшая альтернатива. Это ограничение распространяется на выбранных детей без каких-либо ограничений.
вы можете использовать критерии 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;
Для простого 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();