簡體   English   中英

在JPQL查詢中過濾結果

[英]Filtering results in a JPQL query

我正在嘗試對數據庫中的所有問題進行“過濾”搜索。 現在,我得到一個異常,告訴我無法將枚舉值與字符串進行比較。 是因為我沒有使用枚舉類型聲明時的標准軟件包名稱嗎? 如果是這樣,那是比對包名稱進行硬編碼更好的方法嗎?

異常描述:編譯查詢時出錯[SELECT q FROM Question q WHERE q.status ='APPROVED'],第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();
}

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

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

與其動態地創建查詢而不是串聯查詢部分,還應該使用Criteria API,該API是為實現這一目標而設計的。

您可以嘗試更改:

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

至:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM