在我的应用程序的某个点,我进行计数以显示数据表的总记录 - 在这种情况下按服务计算的合同计数 - 如下所示:
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();
}
Contract 和 Service 是多对多的关系,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 到 Long 的转换线是 countByServices 方法的返回 - 奇怪的是,结果不再是 Long 值,即使投影设置为 rowCount。我也试过
criteria.setProjection(Projections.countDistinct("contract"));
这给了我同样的例外。
我究竟做错了什么?如有必要,我可以为您提供更多代码。谢谢您的帮助。