2013-08-22 41 views
24

Tôi bị kẹt với một vấn đề đơn giản; đấu tranh cách gọi order by trên một thực thể ed join. Về cơ bản tôi đang cố gắng để đạt được những điều sau với JPA Criteria:API truy vấn tiêu chí JPA và đặt hàng theo hai cột

select distinct d from Department d 
left join fetch d.children c 
left join fetch c.appointments a 
where d.parent is null 
order by d.name, c.name 

Tôi đã điều sau đây:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<Department> c = cb.createQuery(Department.class); 
Root<Department> root = c.from(Department.class); 
Fetch<Department, Department> childrenFetch = root.fetch(
    Department_.children, JoinType.LEFT); 
childrenFetch.fetch(Department_.appointments, JoinType.LEFT); 

c.orderBy(cb.asc(root.get(Department_.name))); 
c.distinct(true); 
c.select(root); 
c.where(cb.isNull(root.get(Department_.parent))); 

Làm thế nào để đạt được order by d.name, c.name với Criteria API? Tôi đã thử với Expression, Path nhưng không hoạt động. Mọi con trỏ sẽ được đánh giá cao.

Trả lời

7

tôi đã gặp khó khăn làm như vậy, và tôi đã tìm thấy một giải pháp trên trang này: http://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

//javax.persistence.criteria.CriteriaQuery 
//CriteriaQuery<T> orderBy(Order... o) 

Xác định biểu thức đặt hàng được sử dụng để đặt các kết quả truy vấn. Thay thế các biểu thức sắp xếp trước đó, nếu có. Nếu không có biểu thức thứ tự nào được chỉ định, thứ tự trước đó, nếu có, chỉ đơn giản là bị loại bỏ, và kết quả sẽ được trả về không theo thứ tự cụ thể. Chuỗi từ trái sang phải của các biểu thức sắp xếp xác định mức ưu tiên, theo đó tận cùng bên trái có ưu tiên cao nhất.

Tham số: o - zero hoặc đặt hàng nhiều biểu thức

Returns: truy vấn sửa đổi

Từ: JPA 2,0

+1

Đây là câu trả lời cho tác giả bài viết được mô tả như thế nào? – ByeBye

+1

Tại sao bạn nghĩ nó không? Anh muốn biết, làm thế nào để đặt hàng bởi nhiều tài sản. Câu trả lời của tôi có chứa làm thế nào để làm điều đó ... Tôi có thiếu gì đó không? – Adamsan

+0

Bởi vì nó sẽ không hoạt động với phân biệt và sắp xếp theo thuộc tính từ bảng tham gia – ByeBye

30

Nếu bạn cần thêm vài đơn đặt hàng bạn có thể làm một cái gì đó như (nhưng đối với truy vấn của bạn và các đối tượng gốc khác nhau)

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Route> query = criteriaBuilder.createQuery(Route.class); 
Root<Route> routeRoot = query.from(Route.class); 
query.select(routeRoot); 

List<Order> orderList = new ArrayList(); 
query.where(routeRoot.get("owner").in(user)); 

orderList.add(criteriaBuilder.desc(routeRoot.get("date"))); 
orderList.add(criteriaBuilder.desc(routeRoot.get("rating"))); 

query.orderBy(orderList); 
0

Tôi có cùng một vấn đề với thứ tự bằng cách sử dụng API tiêu chí. Tôi đã tìm thấy giải pháp này:

CriteriaQuery<Test> q = cb.createQuery(Test.class); 
Root<Test> c = q.from(Test.class); 
q.select(c); 
q.orderBy(cb.asc(c.get("name")), cb.desc(c.get("prenom"))); 
Các vấn đề liên quan