5

我有一个实体 beanFooEntity和 DAO 方法来获取按该实体上的属性分组的行计数,封装在视图模型 beanFooCount中。

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...
}

运行它会产生异常,因为会Projections.count()产生 aLong而不是Integer.

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

如果我更改count为 a ,它Long会起作用,但我不想更改视图模型类,因为它用于其他各种地方。

我可以以某种方式Projections.count()返回使结果转换器转换为吗?IntegerLongInteger

4

3 回答 3

4

您可以使用 SQL 投影将其转换为 Integer:

.setProjection( Projections.sqlProjection(
    "Cast(Count(foo) as Integer) count",
    new String[]{"count"},
    new Type[]{StandardBasicTypes.INTEGER}
)
于 2013-05-23T22:58:41.557 回答
1

你不能在属性的setter方法中自己进行转换吗?

于 2013-05-23T14:03:31.193 回答
0

看起来 Hibernate 中 COUNT(*) 函数的标准映射是BigDecimal。所以替换 Integer 可以帮助:

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

  // getters/setters...
}
于 2018-02-26T15:59:45.900 回答