2011-03-22 3 views
3
내가 서브 쿼리/하위 선택 HQL (최대 절전 모드)에서 작동하도록 노력하고 있지만 그것이 작동과 오류가 발생하지 않습니다

...최대 절전 모드 : HQL 행은 내가 거기에 있는지 알고 싶어

하위 쿼리 문제를 카운트 이런 일에 HQL에 상응 :

select count(Z) from (SELECT SUM(existencia), almacen, oficina, fila from re_tinventarioubicacion where inventorybranchto = 2 GROUP BY almacen, oficina, fila, estante, entrepano, casilla, precioetiqueta) as Z 

내가 HQL에 SQL에서 "번역"을 시도했지만 작동하지 않습니다 ("정상적인"SQL) ... 그것은이 발생합니다 :

org.hibernate.hql.ast.QuerySyntaxException : 예상치 못한 토큰

기본적으로 결과 하위 쿼리에서 행 개수를 가져와야합니다.

아이디어가 있으십니까?

답변

0

최대 절전 모드에서 원시 SQL 쿼리를 사용할 수 있지만 반환 값을 매핑하려면 간단한 POJO가 필요합니다 (이 경우 실제로 내장 트랜스포머 중 일부를 시도하거나 프로젝션을 설정하려고합니다. 그것이 효과가 있을지 확실하지 않은 경우).

POJO 반환 값 :

public class MyCount { 
    private Integer count; 

    public void setCount(Integer count) { 
     this.count = count; 
    }  

    public Integer getCount() { 
     return count; 
    } 
} 

검색어 :

Query query = getSession().createSQLQuery("select count(*) from dual"); 
    .addScalar("count") 
    .setResultTransformer(Transformers.aliasToBean(MyCount.class)); 

MyCount count = (MyCount) query.uniqueResult(); 
+0

네, 원시 SQL을 사용했지만, Projection이나 Transformers는 사용하지 않았습니다. 그러나 트랜스포머가 부분적인 해결책 일 수 있다고 생각합니다. 감사합니다! –

0

엔터티를 쿼리하지 않고 HQL에서 무언가를 선택할 수 없습니다.

+0

흠, 나는 그것이 당신의 **에서 ** 섹션에서 하위 선택을 배치 할 수 없다는 사실에 관한 추측 ** select **와 ** where ** 섹션에서만 HQL 쿼리를 사용합니다 (이 예제는 SQL에서 HQL로 직접 "번역"하는 경우입니다). –