Mặc dù câu trả lời được đưa ra bởi johncarl đã được chấp nhận nhưng nó không chính xác với tôi. JavaDocs cho CriteriaQuery.where() nói:
Sửa đổi truy vấn để hạn chế kết quả truy vấn theo biểu thức boolean được chỉ định. Thay thế các giới hạn đã được thêm trước đó, nếu có.
Theo tôi được biết, mỗi người trong số các dòng sau (cho các giới hạn) sẽ ghi đè lên các hạn chế được trước đó:
criteria.where(builder.like(langJoin.get(Language_.locale), locale));
criteria.where(builder.like(pRoot.get(Person_.name), name));
criteria.where(builder.between(pRoot.get(Person_.time), startDate, endDate));
Điều này có nghĩa rằng trong khi kết thúc chỉ giới hạn cuối cùng (giữa bắt đầu và ngày kết thúc) sẽ vẫn còn.
tôi threfore đề nghị sửa đổi câu trả lời johncarl của sau:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createCriteria(Person.class);
Root<Person> pRoot = criteria.from(Person.class);
Join<Person, Language> langJoin = criteria.join("language", JoinType.LEFT);
Predicate[] restrictions = new Predicate[] {
builder.like(langJoin.get(Language_.locale), locale),
builder.like(pRoot.get(Person_.name), name),
builder.between(pRoot.get(Person_.time), startDate, endDate)
};
criteria.where(builder.and(restrictions));
criteria.orderBy(builder.asc(pRoot.get(Person_.name)));
Tuy nhiên, mã này trông thật sự xấu xí! Xin vui lòng, cảm thấy tự do để chỉnh sửa nếu nó sai và bình luận nó nếu bạn nhìn thấy một giải pháp tốt hơn! Tôi sẽ rất duyên dáng!
Bạn có thể hiển thị các triển khai của mình cho Người và Ngôn ngữ không? –