2011-10-19 2 views
10

나는 당신이 SQLProjection 내 루트 개체를 참조 할 {alias}를 사용할 수 있음을 알고 :참조하는 외부 조건은 SQLProjection 내에서 별명을 조회

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

내가 뭘하려고하는 것은이 별칭을 참조하는 루트가 아닌 기업 : i은 외부 기준 쿼리의 별칭입니다

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

. 위의 코드는 i.powerRestarts을 찾을 수 없다는 SQL 예외를 throw합니다.

SQLProjection에서 루트가 아닌 별칭을 참조 할 수 있습니까? Hibernate는 단지 SQLProjection의 SQL 문자열에 {alias}을 사용하여 루트 엔티티 별칭을 포함 할 수 있습니다 -

답변

12

는이 이것이 가능하지 않은 것 같습니다, 일부 인터넷 검색을 수행 가졌어요. 그러나 나는 Hibernate JIRA 페이지에서 this issue regarding the limitation을 발견했다.

SQLProjection 문자열에 루트가 아닌 별칭을 사용할 수있는 패치를 누군가 RestrictionsExt 클래스를 통해 제출했습니다. 내가 열 별칭 유형의 지정을 허용하는 정적 RestrictionsExt.sqlProjection 방법을 수정했다

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

("value" : 질문에서 내 예를 사용하여 다음과 같이

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

별명 i 이제 참조 할 수 있습니다) (여기서는 LongType으로 정의 됨) 패치는 이것을 허용하지 않으므로 기본값은 StringType입니다.

패치의 SQLAliasedProjection 클래스는 org.hibernate.loader.criteria.CriteriaQueryTranslator : getOuterQueryTranslatorgetAliasedCriteria의 개인 메서드에 액세스해야합니다.

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

이 변경되었습니다 :

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); 

는 희망이 같은 문제에 직면 다른 사람을 도움이 될 것입니다이 최대 절전 모드 소스를 수정하지 않고 작동하도록하기 위해, 나는 반사를 사용했다.

관련 문제