2013-05-23 1 views
4

엔터티 빈 FooEntity 및 DAO 메서드를 사용하여 뷰 모델 Bean FooCount에 캡슐화 된 해당 엔터티의 속성별로 그룹화 된 행 수를 얻습니다. Projections.count()Integer 대신 Long을 산출 이후이 실행Hibernate 4.1 결과 투영기를 사용하여 카운트 프로젝션 유형 불일치 (Long/Integer)

public List<FooCount> groupByFoo() { 
    return sessionFactory.getCurrentSession() 
     .createCriteria(FooEntity.class) 
     .setProjection(Projections.projectionList() 
      .add(Projections.groupProperty("foo"), "foo") 
      .add(Projections.count("foo"), "count") 
     ).setResultTransformer(Transformers.aliasToBean(FooCount.class)) 
     .list(); 
} 

public class FooCount { 
    private String foo; 
    private Integer count; // <-- this is the problem 
    // getters/setters... 
} 

는 예외를 준다. 나는 Longcount을 변경하지만 난 그게 여러 다른 장소이다 사용되는 뷰 모델 클래스를 변경하지 않으려한다면

org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of FooCount.count 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:119) 
--snip-- 
    Caused by: java.lang.IllegalArgumentException: argument type mismatch 

그것은 작동합니다.

나는 어느 쪽 Integer 어떻게 든 또는이 결과 변압기 Long에서 Integer로 변환 할 Projections.count() 수익을 만들 수 있습니까?

답변

3

당신은 SQL 투영을 사용하여 정수로 캐스팅 할 수 있습니다 : 그것은 COUNT에 대한 표준 매핑과 같은

.setProjection(Projections.sqlProjection(
    "Cast(Count(foo) as Integer) count", 
    new String[]{"count"}, 
    new Type[]{StandardBasicTypes.INTEGER} 
) 
+0

아 화려한를 변경 포함되지 않은 방법을 기대했다 : 그래서 도움이 될 수 있습니다 정수의 교체. 실제 코드가 게시 한 SSCCE보다 더 복잡하기 때문에 현재 솔루션보다 훨씬 뛰어납니다. 이렇게하면 훨씬 단순화 할 수 있습니다. 감사. – Zutty

1

속성의 설정 메소드에서 직접 변환을 수행 할 수 없습니까?

+0

하지만'FooCount' 콩 – Zutty

0

(*) 최대 절전 모드에서 기능 BigDecimal입니다. 나는이 시도했다

public class FooCount { 
    private String foo; 
    private BigDecimal count; // <-- 

    // getters/setters... 
}