2011-10-19 27 views
10

Tôi biết rằng bạn có thể sử dụng {alias} để tham khảo các thực thể gốc trong một SQLProjection:Tham khảo các tiêu chí bên ngoài truy vấn bí danh từ bên trong một SQLProjection

Projections.sqlProjection("MIN({alias}.field) as value", new String[]{"value"}, new Type[]{new LongType()})) 

Những gì tôi đang cố gắng làm là để tham khảo một bí danh cho một không phải root thực thể:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()})) 

nơi i là một bí danh từ tiêu chí truy vấn bên ngoài. Đoạn mã trên ném một ngoại lệ SQL nói rằng không thể tìm thấy i.powerRestarts.

Có thể tham chiếu đến bí danh không phải gốc từ SQLProjection không?

Trả lời

12

Sau khi thực hiện một số googling, có vẻ như điều này là không thể - Hibernate chỉ cho phép bao gồm bí danh thực thể gốc bằng cách sử dụng {alias} trong chuỗi SQL của SQLProjection. Tuy nhiên tôi đã tìm thấy this issue regarding the limitation trên các trang JIRA Hibernate.

Ai đó đã gửi một bản vá cho phép sử dụng bí danh không phải gốc trong chuỗi SQLProjection, thông qua lớp học RestrictionsExt mới. Sử dụng ví dụ của tôi từ câu hỏi:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()})) 

Các bí danh i bây giờ có thể được tham chiếu như:

RestrictionsExt.sqlProjection("MIN({i}.powerRestarts) as value", "value", new LongType()) 

tôi đã phải thay đổi RestrictionsExt.sqlProjection phương pháp tĩnh để cho phép đặc điểm kỹ thuật của các loại cho bí danh cột ("value") (ở đây được định nghĩa là LongType), vì bản vá không cho phép điều này và được mặc định là StringType.

Lớp SQLAliasedProjection trong bản vá cũng yêu cầu quyền truy cập vào các phương thức riêng tư sau đây trong org.hibernate.loader.criteria.CriteriaQueryTranslator: getOuterQueryTranslatorgetAliasedCriteria. Để có được điều này để làm việc mà không sửa đổi các nguồn Hibernate, tôi đã sử dụng phản ánh:

cri = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getAliasedCriteria(alias); 

đã được đổi thành:

Method m = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getClass().getDeclaredMethod("getAliasedCriteria", String.class); 
m.setAccessible(true); 
cri = (Criteria) m.invoke(((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery), alias); 

Hy vọng rằng điều này sẽ giúp bất cứ ai khác phải đối mặt với cùng một vấn đề.

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