Фильтрация результатов в запросе JPQL - PullRequest
2 голосов
/ 16 декабря 2011

Я пытаюсь сделать «фильтр» поиска по всем вопросам в моей базе данных. Теперь я получаю исключение, говорящее мне, что я не могу сравнить значения перечисления со строкой. Это потому, что я не использую полное имя пакета, в котором объявлен тип enum? Если так, то лучше ли это, чем жестко задавать название пакета?

Описание исключения: Ошибка компиляции запроса [SELECT q FROM Вопрос q ГДЕ q.status = 'УТВЕРЖДЕН'], строка 1, столбец 40: неверно enum равное выражение, не может сравнивать перечислимое значение типа [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();
}

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

Правильнее всего было бы использовать параметр запроса:

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

Вместо того чтобы создавать запрос динамически, объединяя части запроса, вам также следует использовать Criteria API, который был разработан с этой целью.

3 голосов
/ 16 декабря 2011

Можете ли вы попробовать изменить:

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

Кому:

jpql += "q.status = app.utility.Status." + status;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...