2010-10-29 26 views
7

Tôi đang cố gắng chuyển đổi một 'TableController'-Class mà chúng tôi đã sử dụng (không có ORM) để tạo SQL động (thực tế là cột thứ tự và hướng được nối vào SQL). Hãy suy nghĩ về điều này 'TableController' như là một lớp có chức năng trả về một danh sách các thực thể của một lớp nhất định (được biết trong thời gian chạy), theo một thứ tự đã cho (cột chuỗi/tên thuộc tính, boolean asc/desc, cả hai) trong thời gian chạy).Phương pháp hay nhất để tạo truy vấn động, được đánh máy JPA?

Thách thức hiện nay, với JPA (Hibernate - nhưng khách hàng chỉ cần sử dụng Giao diện JPA): Làm thế nào tôi có thể nhận ra điều này mà không cần ghép nối Chuỗi và theo cách an toàn?

Cảm ơn!

Trả lời

18

Hiện tại, với JPA (Hibernate - nhưng khách hàng chỉ sử dụng giao diện JPA): làm cách nào tôi có thể nhận ra điều này mà không cần ghép chuỗi và theo cách an toàn?

Nếu bạn đang sử dụng triển khai JPA 2.0, tôi nghĩ bạn nên xem Criteria API để tạo truy vấn động.

Nếu bạn đang sử dụng JPA 1.0, không có cách nào tiêu chuẩn ngoài chuỗi nối (và đề xuất của tôi sẽ là sử dụng độc quyền của Hibernate Criteria Queries).

Bài viết sau đây cũng có thể cung cấp cho bạn một số ý tưởng (cụ thể): Hibernate Querying 102 : Criteria API.


Hãy tưởng tượng một phương pháp mà có ba thông số: Lớp entityClass, String orderByColumn, boolean tăng dần. Làm thế nào tôi sẽ tạo ra một truy vấn mà không có chuỗi nối mà mang lại cho tôi tất cả các đối tượng của các lớp học được đưa ra theo thứ tự chính xác?

Với API Tiêu chuẩn từ JPA 2.0, bạn có thể làm một cái gì đó như thế này:

public <T> List<T> findAllEntitiesOrderedBy(Class<T> entityClass, String orderByColumn, boolean ascending) { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 

    CriteriaQuery<T> criteria = builder.createQuery(entityClass); 
    Root<T> entityRoot = criteria.from(entityClass); 
    criteria.select(entityRoot); 
    javax.persistence.criteria.Order order = ascending ? builder.asc(entityRoot.get(orderByColumn)) 
     : builder.desc(entityRoot.get(orderByColumn)); 
    criteria.orderBy(order); 
    return em.createQuery(criteria).getResultList(); 
} 
+0

Pascal - cảm ơn bạn đã gợi ý của bạn. Chúng tôi sử dụng JPA 2.0 và tôi đã nghĩ rằng nó sẽ dẫn chúng tôi đến API tiêu chí. Nhưng làm thế nào tôi có thể giải quyết vấn đề cụ thể này tôi mô tả? – Zeemee

+0

Không thể chính xác hơn với mô tả thực tế của sự cố. –

+1

Xin lỗi vì sự chậm trễ của tôi - Hãy tưởng tượng một phương thức có ba tham số: Class entityClass, String orderByColumn, boolean ascending. Làm thế nào tôi sẽ tạo ra một truy vấn mà không có chuỗi nối mà mang lại cho tôi tất cả các đối tượng của các lớp học được đưa ra theo thứ tự chính xác? Cảm ơn! – Zeemee

Các vấn đề liên quan