2011-12-16 115 views
2

我正在嘗試對數據庫中的所有問題進行「篩選」搜索。現在我得到一個異常告訴我,我不能將枚舉值與字符串進行比較。是否因爲我沒有使用聲明枚舉類型的標準包名稱?如果是這樣,是否比硬編碼包名稱更好?在JPQL查詢中篩選結果

異常描述:錯誤編譯查詢[選擇Q FROM 問題q其中q.status = '已批准'],第1行,列40:無效 枚舉等於表達,不能比較 類型[的枚舉值app.utility.Status}使用非枚舉值,類型爲 [java.lang.String]。

public List<Question> all(Status status, ViewOption viewOption) { 
    String jpql = "SELECT q FROM Question q "; 
    boolean isWhereClauseAdded = false; 

    if (status != Status.ALL) { 
     if (!isWhereClauseAdded) { 
      jpql += "WHERE "; 
     } 

     jpql += "q.status = '" + status + "'"; 
    } 

    if (viewOption != ViewOption.ALL) { 
     if (!isWhereClauseAdded) { 
      jpql += "WHERE "; 
     } 

     // Check if 'AND' operator is needed. 
     if (status != Status.ALL) { 
      jpql += " AND "; 
     } 

     switch (viewOption) { 
     case ONLY_IMAGES: 
      jpql += "q.image != ''"; 
      break; 
     case NO_IMAGES: 
      jpql += "q.image = '' "; 
      break; 
     } 
    } 

    TypedQuery<Question> query = entityManager.createQuery(jpql, 
      Question.class); 

    return query.getResultList(); 
} 

回答

4

做的是使用的查詢參數的正確的事情:

String jpql = "select ... where q.status = :status"; 
Query query = em.createQuery(jpql).setParameter("status", status); 

而不是動態地創建查詢來連接查詢部分,您還應該使用Criteria API,該標準API是爲了這個目標而設計的。

+0

是的,我將它添加到* todo *列表中,以將其重構爲使用Criteria API。 – LuckyLuke 2011-12-16 20:19:08

3

你可以嘗試改變:

jpql += "q.status = '" + status + "'"; 

要:

jpql += "q.status = app.utility.Status." + status;