web-dev-qa-db-ja.com

JPA列挙比較が等しくない

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

等しくない(!=)から等しい(=)に変更すると、クエリは正常に機能します。

では、等しくない列挙型比較をどのように使用できますか?

13
veote

等しくない? <>この演算子を使用します。

JPQL演算子に従って JPQL言語のセクション10.2.5.6。リファレンス

  1. ナビゲーション演算子(。)
  2. 算術演算子:+、-単項*、/乗算​​と除算+、-加算と減算
  3. 比較演算子:=、>、> =、<、<=、<>(等しくない)、[NOT] BETWEEN、[NOT] LIKE、[NOT] IN、IS [NOT] NULL、IS [NOT] EMPTY、[NOT] MEMBER [OF]
  4. 論理演算子:NOT AND OR
38
Zaw Than oo

Jpqlを使用する場合、"等しくない"の正しい演算子は<>です。したがって、次のようにコードを更新します。

 return em.createQuery("SELECT c FROM MyEntity c  WHERE  c.reminderStage <> :reminderStage", MyEntity.class)
                .setParameter("reminderStage", stage).getResultList();

削除!=代わりに用途<>を使用します。

2