Trong Hibernate, bạn có thể thêm những hạn chế SQL thực tế, nhưng đáng chú ý là điều này sẽ mang tính đặc thù của Oracle. Nếu bạn chuyển sang PostgreSQL, điều này sẽ bị ngắt và bạn cần LIMIT 100
thay thế.
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 100"));
Trong JPA API, câu trả lời ngắn là bạn có thể không ... Trong câu hỏi của bạn, bạn đề xuất sử dụng API Tiêu chuẩn (cùng với một subquery). Tuy nhiên, nó không phải là cho đến khi bạn thực sự gọi EntityManager.createQuery(criteriaQuery)
mà bạn sẽ nhận được một TypedQuery
nơi bạn có thể chỉ định giá trị maxResult
.
Điều đó nói rằng, bạn có thể phá vỡ nó thành 2 truy vấn, là người đầu tiên mà bạn có được kết quả nội chọn (tối đa 100) và sau đó một lần 2 Criteria
nơi bạn lấy danh sách kết quả là một 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();
Nguồn
2016-05-18 13:56:04
Nếu bạn không thể tìm ra cách để giới hạn truy vấn con, thì cách sử dụng kết nối? – Traubenfuchs
@Traubenfuchs Phải có hơn 100 kết quả trong truy vấn. Hãy nghĩ về truy vấn phụ là bản ghi cha mẹ và kết quả tôi muốn quay lại với tư cách là con cái. Một số cha mẹ có nhiều con. Tôi không thấy làm thế nào tôi có thể hoàn thành việc tìm kiếm trẻ em cho 100 bậc cha mẹ đầu tiên bằng cách tham gia. – Danny
Mệnh đề where là động và thường là nhiều hơn thì chỉ là các hàng X đầu tiên trong bảng. Tôi nên nói rằng trong câu hỏi. – Danny