JPA 2.1.2を使用しています。
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();
}
}
しかし、クエリを実行すると、次の例外が発生します。
...
[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
等しくない(!=)から等しい(=)に変更すると、クエリは正常に機能します。
では、等しくない列挙型比較をどのように使用できますか?
等しくない? <>
この演算子を使用します。
JPQL演算子(に従って JPQL言語のセクション10.2.5.6。リファレンス )
Jpqlを使用する場合、"等しくない"の正しい演算子は<>です。したがって、次のようにコードを更新します。
return em.createQuery("SELECT c FROM MyEntity c WHERE c.reminderStage <> :reminderStage", MyEntity.class)
.setParameter("reminderStage", stage).getResultList();
削除!=代わりに用途<>を使用します。