有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java过滤会导致JPQL查询

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

Exception Description: Error compiling the query [SELECT q FROM Question q WHERE q.status = 'APPROVED'], line 1, column 40: invalid enum equal expression, cannot compare enum value of type [app.utility.Status} with a non enum value of type [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) 个答案

  1. # 1 楼答案

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

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

    您还应该使用Criteria API,而不是通过连接查询部分来动态创建查询,该API的设计就是为了实现这一目标

  2. # 2 楼答案

    你能试着改变一下吗

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

    致:

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