繁体   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