2011-12-16 92 views
2

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

异常描述:错误编译查询[选择Q FROM 问题q其中q.status = '已批准'],第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(); 
} 

回答

4

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

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

而不是动态地创建查询来连接查询部分,您还应该使用Criteria API,该标准API是为了这个目标而设计的。

+0

是的,我将它添加到* todo *列表中,以将其重构为使用Criteria API。 – LuckyLuke 2011-12-16 20:19:08

3

你可以尝试改变:

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

要:

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