org.hibernate.Criteria与Projections.rowCount()无法正常工作

时间:2013-05-23 13:45:24

标签: hibernate count criteria hibernate-criteria

在我的应用程序的某个点上,我会计算显示数据表的总记录 - 在这种情况下按服务的合同计数 - 如下:

public int countByServices(ContractFilter filter) {
        Criteria criteria = ((Session) entityManager.getDelegate()).createCriteria(ContractServiceDB.class);
        criteria.createAlias("contract", "contract", Criteria.INNER_JOIN);
        criteria.add(Restrictions.eq("contract.status", filter.getStatus().getId()));
        criteria.add(Restrictions.isNull("contract.processed"));
        criteria.add(Restrictions.eq("contract.customerId", filter.getCustomerId()));
        criteria.add(Restrictions.in("service", filter.getServices()));
        criteria.setProjection(Projections.rowCount());
        return ((Long) criteria.uniqueResult()).intValue();
}

合同和服务具有多对多关系,ContractServiceDB是链接实体,因为它具有自己的属性。查询第一次运行正常,但是稍后再次调用该方法会引发异常:

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.foo.bar.db.entity.ContractServiceDBPK.cdSncode
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field br.com.foo.bar.db.entity.ContractServiceDBPK.cdSncode to java.lang.Long

cdSncode是实体的主键之一,因为它是嵌入式的。当然,我宣布了它的吸气剂:

public String getCdSncode() {
        return this.cdSncode;
}

String to Long转换行是countByServices方法的返回 - 奇怪的是,即使将投影设置为rowCount,结果也不再是Long值。我也试过

criteria.setProjection(Projections.countDistinct("contract"));

给了我同样的例外。

我做错了什么?如有必要,我可以为您提供更多代码。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。

看起来就像你正在以错误的方式做一个标准:

criteria.add(Restrictions.eq("contract.status", filter.getStatus().getId()));

你必须改为“contract.status.id”。