过滤会导致JPQL查询

时间:2011-12-16 15:50:26

标签: java java-ee jpa

我正在尝试对我的数据库中的所有问题进行“过滤”搜索。现在我得到一个异常告诉我,我无法将枚举值与字符串进行比较。是因为我没有使用枚举类型声明的完全限定的包名吗?如果是这样,它是否比硬编码包名称更好?

  

异常说明:编译查询时出错[SELECT q FROM   问题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();
}

2 个答案:

答案 0 :(得分:4)

正确的做法是使用查询参数:

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

您应该使用Criteria API,而不是动态地创建查询来连接查询部分,而这些API的设计考虑了这一目标。

答案 1 :(得分:3)

你可以尝试改变:

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

要:

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