web-dev-qa-db-fra.com

La comparaison des énumérations JPA n'est pas égale

J'utilise JPA 2.1.2.

Je veux exécuter une requête select avec une clause where. L'instruction where doit comparer les énumérations (non égales) stockées dans la base de données (chaîne).

@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();

    }
}

Mais lorsque j'exécute la requête, j'obtiens l'exception suivante:

...
[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

Lorsque je change de non égal (! =) À égal (=), la requête fonctionne correctement.

Alors, comment puis-je utiliser la comparaison enum avec pas égal?

13
veote

Inégal ? <> utilise cet opérateur.

Opérateurs JPQL (selon Section 10.2.5.6. Du Référence de langage JPQL )

  1. Opérateur de navigation (.)
  2. Opérateurs arithmétiques: +, - unaire *,/multiplication et division +, - addition et soustraction
  3. Opérateurs de comparaison: =,>,> =, <, <=, <> (non égal), [PAS] ENTRE, [PAS] SIMILAIRE, [PAS] DANS, IS [PAS] NULL, IS [NON] VIDE, [NON] MEMBRE [DE]
  4. Opérateurs logiques: NOT AND OR 
37
Zaw Than oo

Lors de l'utilisation de Jpql, l'opérateur correct pour "différent de" est <> . Alors, mettez à jour votre code comme ceci:

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

Supprimez! = utilisez <> à la place.

1
Edgencio Da Calista