W Hibernate, można dodać rzeczywiste ograniczenie SQL, ale warto zauważyć, że będzie to specyficzne dla Oracle. Jeśli przełączyłeś się na PostgreSQL, to by się zepsuło i potrzebowałbyś zamiast tego LIMIT 100
.
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 100"));
W JPA API, krótka odpowiedź jest taka, że nie można ... W swoim pytaniu pan zaproponował używając API kryteria (wraz z podzapytania). Jednak dopiero gdy zadzwonisz pod numer EntityManager.createQuery(criteriaQuery)
, otrzymasz numer TypedQuery
, w którym możesz podać wartość maxResult
.
To powiedziawszy, można podzielić go na 2 pytania, pierwsze, gdzie można uzyskać wewnętrzne-select wyniki (max 100), a następnie 2-ta Criteria
gdzie wziąć wynikowej liście w 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();
Jeśli nie możesz dowiedzieć się, jak ograniczyć podzapytanie, a może użyć funkcji łączenia? – Traubenfuchs
@Traubenfuchs W zapytaniu powinno być więcej niż 100 wyników. Pomyśl o tym, że podzapytanie jest rekordem nadrzędnym, a wyniki, które chcę, z powrotem jako dzieci. Niektórzy rodzice mają wiele dzieci. Nie rozumiem, w jaki sposób udało mi się znaleźć dzieci dla pierwszych 100 rodziców korzystających z join. – Danny
Klauzula where jest dynamiczna i zazwyczaj jest to więcej niż pierwsze X wierszy w tabeli. Powinienem o tym wspomnieć w pytaniu. – Danny