2011-11-30 17 views
10

Tôi muốn chuyển các truy vấn JPAQL của mình thành các truy vấn API tiêu chí.Đường dẫn API tiêu chí tới id tổ chức phụ phụ

xem xét truy vấn như thế này:

SELECT e FROM Entity e WHERE e.parent.id = :parentId 

WHERE phần được chuyển thành:

Path<Long> parentId = root.get(Entity_.parent).get(ParentEntity_.id); 
Predicate whereParentId = builder.equal(parentId, selectedParent.getId()); 

Câu hỏi đặt ra là, làm thế nào để tạo vị cho WHERE như thế này:

SELECT e FROM Entity e WHERE e.parent.parent.id = :parentId 

thế nào để tạo Path cho phụ huynh của id chính?

Trả lời

7

Nếu JPQL bạn đã hiển thị đang hoạt động, thì tôi giả định rằng ParentEntity của bạn đang giữ tham chiếu đến phụ huynh của nó (theo dạng parent trường là loại ParentEntity). Do đó, một cái gì đó như thế này nên làm việc:

Path<Long> parentId = root.get(Entity_.parent) 
    .get(ParentEntity_.parent) 
    .get(ParentEntity_.id); 
Predicate whereParentId = builder.equal(
    parentId, selectedParent.getId() 
); 

tôi đã thực hiện điều tương tự nhưng đối với một thực thể (Customer là con và công ty mẹ cùng một lúc và tham chiếu cha mẹ của mình thông qua parent lĩnh vực Customer loại) và một cái gì đó như này làm việc hoàn toàn tốt đẹp:

query.select(customer) 
    .where(criteriaBuilder.equal(
     customer.get("parent").get("parent").get("id"), 
     criteriaBuilder.parameter(int.class, "parentId")) 
    ); 

List<Customer> customers = em.createQuery(query) 
    .setParameter("parentId", john.getId()).getResultList(); 
+0

Làm thế nào bạn có thể làm điều đó cho một phần tử bên trong Bản đồ? 'Đường dẫn path = entity.get (" mapAtribute) ... ' Tôi không biết cách chuyển Khóa khi tôi lấy Bản đồ để lấy Phần tử mong muốn. Đây là câu hỏi lỗ của tôi: http : //stackoverflow.com/questions/21436972/jpa-2-criteria-for-sorting-based-on-an-atribute-from-a-map-value Cảm ơn! – Gayolomao

1
SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId 

trong tiêu chí gọi nó là một Alias ​​như:

sess.createCriteria(Entity.class) 
    .createAlias("e.parent", "p") 
Các vấn đề liên quan