В Hibernate, вы можете добавить фактическое ограничение SQL, но стоит отметить, что это будет характерно для Oracle. Если вы перейдете на PostgreSQL, это сломается, и вам понадобится LIMIT 100
.
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 100"));
В JPA API, короткий ответ, что вы не можете ... В своем вопросе вы предложили использовать Criteria API (наряду с подзапрос). Однако только после того, как вы на самом деле позвоните EntityManager.createQuery(criteriaQuery)
, вы получите TypedQuery
, где вы можете указать значение maxResult
.
Это говорит, вы можете разбить его на 2 запросов, то первое, где вы получите внутрипартийные выбрать результаты (не более 100), а затем второй Criteria
, где вы берете полученный список в in()
:
// inner query
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<YourClass> innerCriteriaQuery = cb.createQuery(YourClass.class);
Root<YourClass> yourClass = innerCriteriaQuery.from(YourClass.class);
innerCriteriaQuery.select(yourClass).where(
cb.equal(yourClass.get(YourClass_.stateCode), someStateValue));
// list of 100 parent ids
List<YourClass> list = em.createQuery(innerCriteriaQuery).setMaxResults(100).getResultList();
// outer query
CriteriaQuery<YourClass> criteriaQuery = cb.createQuery(YourClass.class);
Root<YourClass> yourClass = criteriaQuery.from(YourClass.class);
criteriaQuery.select(yourClass).where(
cb.in(yourClass.get(YourClass_.parentId)).value(list);
return em.createQuery(criteriaQuery).getResultList();
Если вы не можете понять, как ограничить подзапрос, как насчет использования соединения? – Traubenfuchs
@Traubenfuchs В запросе должно быть более 100 результатов. Подумайте о том, что подзапрос - это родительские записи и результаты, которые я хочу вернуть в качестве детей. У некоторых родителей несколько детей. Я не вижу, как я мог бы найти детей для первых 100 родителей, используя соединение. – Danny
Предложение where является динамическим, и обычно это больше, чем только первые X строк в таблице. Я должен был упомянуть об этом в вопросе. – Danny