2012-02-07 66 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