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
: getOuterQueryTranslator
và getAliasedCriteria
. Để 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 đề.