2012-02-07 70 views
0

我遇到Subqueries.exists条件的问题。Hibernate子查询。存在

我有以下几点:

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); 

如果我通过空用户(不使用Subqueries.exists)它的工作原理很好,而且我返回有效的费用项目。如果我给用户,如果给我以下内容:

org.springframework.orm.hibernate3.HibernateSystemException:无法通过反射得到一个字段值getter的Expense.id;嵌套的例外是org.hibernate.PropertyAccessException:无法获取日志中由Expense.id

和更低的反射吸气字段值:

无法设置为java.lang.Integer场Expense.id到Java .lang.String

有没有人有任何想法我做错了什么?

回答

7

我觉得有两个问题在查询:

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

如果似乎来自此Restrictions.eq(“userExpense.primaryKey.expense”,“mainExpense.id”),但它不起作用,因为您建议: - ? – Razvi 2012-02-07 20:47:44

+0

它怎么不起作用?什么是例外?您在费用中有ID字段吗? – 2012-02-07 20:49:41

+0

java.lang.ClassCastException:java.lang.String不能转换为java.lang.Integer – Razvi 2012-02-07 21:09:46