Hibernate Subqueries.exists

Raz*_*zvi 1 java spring hibernate criteria-api

我遇到了Subqueries.exists标准的问题.

我有以下内容:

DetachedCriteria criteria = DetachedCriteria.forClass(Expense.class, "mainExpense")
        .add(Restrictions.eq("group", group))
        .addOrder(Order.desc("created"));

if (all) {
    criteria.add(
            Restrictions.or(
                    Restrictions.eq("status", ExpenseStatus.PENDING),
                    Restrictions.eq("status", ExpenseStatus.COMPLETE)
            ));
} else {
    criteria.add(Restrictions.eq("status", ExpenseStatus.PENDING));
}

if (user != null) {
    DetachedCriteria userSubCriteria = DetachedCriteria.forClass(UserExpense.class, "userExpense")
            .add(Restrictions.eq("userExpense.primaryKey.user", user))
            .add(Restrictions.eq("userExpense.primaryKey.expense", "mainExpense"))
            .setProjection(Projections.property("userExpense.primaryKey"));
    criteria.add(Subqueries.exists(userSubCriteria));
}

return getHibernateTemplate().findByCriteria(criteria);
Run Code Online (Sandbox Code Playgroud)

如果我传递一个空用户(不使用Subqueries.exists),它可以正常工作并返回有效的费用项目.如果我给用户如果给我以下内容:

org.springframework.orm.hibernate3.HibernateSystemException:无法通过Expense.id的反射getter获取字段值; 嵌套异常是org.hibernate.PropertyAccessException:无法通过Expense.id的反射getter获取字段值

并在日志中降低:

无法将java.lang.Integer字段Expense.id设置为java.lang.String

有没有人知道我做错了什么?

JB *_*zet 8

我认为查询中存在两个问题:

  1. 存在的子查询应该有一个返回单个列的投影.您正在使用返回嵌入对象的投影.
  2. 您将"userExpense.primaryKey.expense"与"mainExpense"进行比较Restrictions.eq().我不认为这是有效的.你应该用Restrictions.eqProperty("userExpense.primaryKey.expense.id", "mainExpense.id")