Java JPA 枚举比较不相等失败
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24989710/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JPA enum comparison not equal fails
提问by veote
I am using JPA 2.1.2.
我正在使用 JPA 2.1.2。
I want to execute a select query with a where clause. The where statement should compare (not equal) enums stored in database (string).
我想用 where 子句执行选择查询。where 语句应该比较(不等于)存储在数据库(字符串)中的枚举。
@Entity
@Table(name = "MY_ENTITY")
public class MyEntity implements Serializable {
@Column(name = "REMINDER_STATE")
@Enumerated(EnumType.STRING)
private ReminderStage reminderStage;
...
}
class DaoImpl{
....
@Override
public List<MyEntity> findAll(ReminderStage stage) {
return em.createQuery("SELECT c FROM MyEntity c WHERE c.reminderStage != :reminderStage", MyEntity.class)
.setParameter("reminderStage", stage).getResultList();
}
}
But when I execute the query I get the following exception:
但是当我执行查询时,我收到以下异常:
...
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R Caused by: <openjpa-2.1.2-SNAPSHOT-r422266:1530146 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter 'SELECT c FROM CertInfo c WHERE c.reminderStage != :reminderStage'. Error message: org.apache.openjpa.kernel.jpql.TokenMgrError: Lexical error at line 1, column 50. Encountered: "!" (33), after : ""
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.parse(JPQLExpressionBuilder.java:2449)
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.<init>(JPQLExpressionBuilder.java:2432)
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:49)
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:154)
[28.07.14 08:27:07:910 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:672)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:654)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:996)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:107)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:86)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:34)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:974)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at com.ibm.ws.jpa.management.JPATxEmInvocation.createQuery(JPATxEmInvocation.java:353)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at com.ibm.ws.jpa.management.JPAEntityManager.createQuery(JPAEntityManager.java:550)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R at ...findAll(DaoImpl.java:271)
[28.07.14 08:27:07:911 CEST] 0000004e SystemErr R ... 13 more
When I change from not equal (!=) to equal (=) the query works fine.
当我从不等于 (!=) 更改为等于 (=) 时,查询工作正常。
So how can I use enum comparison with not equal?
那么如何使用不等于的枚举比较呢?
采纳答案by Zaw Than oo
Not equal ? <>
use this operator.
不相等?<>
使用此运算符。
JPQL operators(according to Section 10.2.5.6.of the JPQL Language Reference)
JPQL运营商(根据第10.2.5.6。所述的JPQL语言参考)
- Navigation operator (.)
- Arithmetic operators: +, - unary *, / multiplication and division +, - addition and subtraction
- Comparison operators: =, >, >=, <, <=, <> (not equal), [ NOT ] BETWEEN, [ NOT ] LIKE, [ NOT ] IN, IS [ NOT ] NULL, IS [ NOT ] EMPTY, [ NOT ] MEMBER [ OF ]
- Logical operators: NOT AND OR
- 导航运算符 (.)
- 算术运算符:+、-一元*、/乘除+、-加减
- 比较运算符:=、>、>=、<、<=、<>(不等于)、[ NOT ] BETWEEN、[ NOT ] LIKE、[ NOT ] IN、IS [ NOT ] NULL、IS [ NOT ] EMPTY、[不是 ] 成员 [ 的 ]
- 逻辑运算符:NOT AND OR
回答by Edgencio Da Calista
When using Jpql, the correct operator for "not equal"is <>. So, update your code like this:
使用 Jpql 时,“不等于”的正确运算符是<>。所以,像这样更新你的代码:
return em.createQuery("SELECT c FROM MyEntity c WHERE c.reminderStage <> :reminderStage", MyEntity.class)
.setParameter("reminderStage", stage).getResultList();
Remove !=an use <>instead.
删除!=使用<>代替。