JPA enum comparaison non pas l'égalité échoue
Je suis en utilisant JPA 2.1.2.
Je veux exécuter une requête select avec une clause where. La où la déclaration doit comparer (pas égal à) enums stockées dans la base de données (chaîne de caractères).
@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
Quand je change de pas égal à (!=) à égalité (=) la requête fonctionne très bien.
Alors, comment puis-je utiliser enum comparaison avec pas égaux?
OriginalL'auteur veote | 2014-07-28
Vous devez vous connecter pour publier un commentaire.
Pas égaux ?
<>
utiliser cet opérateur.JPQL opérateurs (selon Section 10.2.5.6. de la De Référence du Langage JPQL)
OriginalL'auteur Zaw Than oo
Lors de l'utilisation de Jpql, le bon opérateur pour "pas égal" est <> . Donc, mettre à jour votre code comme ceci:
Supprimer != une utilisation <> à la place.
OriginalL'auteur Edgencio Da Calista