Problèmes lors d’une requête lors de l’utilisation d’Enum dans l’entité

J’ai les éléments suivants dans une entité Question:

@NamedQuery(name = "Question.allApproved", query = "SELECT q FROM Question q WHERE q.status = 'APPROVED'") 

et

 @Enumerated(EnumType.STRING) private Status status; // usual accessors 

Je reçois cette exception:

Exception Description: Erreur lors de la compilation de la requête [Question.countApproved: SELECT COUNT(q) FROM Question q WHERE q.status = 'APPROVED' ], ligne 1, colonne 47: expression enum non valide, ne peut pas comparer la valeur enum de type [myCompnay.application.Status] avec une valeur non enum de type [java.lang.Ssortingng] . à org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy (EntityManagerSetupImpl.java:501)

Comment puis-je réparer ça?

Je pense que vous devriez utiliser votre enum (complet) Status au lieu de la valeur littérale, donc quelque chose comme ceci: (en supposant que votre enum de Status est dans le package com.myexample )

 @NamedQuery(name = "Question.allApproved", query = "SELECT q FROM Question q WHERE q.status = com.myexample.Status.APPROVED"). 

4 ans après le post initial, il y a quelques développements. En utilisant Spring 4 et Hibernate 4, il est maintenant possible de tromper Hibernate en utilisant une expression SpEL. Par exemple:

Le enum:

 package com.mycompany.enums public enum Status { INITIAL, PENDING, REJECTED, APPROVED, SHIPPED, DELIVERED, COMPLETE; } 

Voici une classe de wrapper appelée ‘Filter’ que nous allons passer à la méthode de filtrage du référentiel.

 package com.mycompany.enums public class Filter implements Serializable { /** The id of the filtered item */ private Integer id; /** The status of the filtered item */ private Status status; // more filter criteria here... // getters, setters, equals(), hashCode() - omitted for brevity /** * Returns the name of the status constant or null if the status is null. This is used in the repositories to filter * queries by the status using a the SPEL (T) expression, taking advantage of the status qualified name. For example: * {@code :#{T(com.mycompany.enums.Status).#filter.statusName}} * * @return the status constant name or null if the status is null */ public Ssortingng getStatusName() { return null == status ? status : status.name(); } } 

Enfin, dans le référentiel, nous pouvons maintenant utiliser la classe Filter comme paramètre unique et faire en sorte que la requête traduise ce qui semble être un mélange d’expressions littérales et d’expressions SpEL dans un object Status:

Le repository:

 package com.mycompany.repository @Repository public interface OrderRepository extends CrudRepository { @Query("SELECT o from Order o " + "WHERE o.id = COALESCE(:#{#filter.id},o.id) " + "AND o.status = COALESCE(:#{T(com.mycompany.enums.Status).#filter.statusName},o.status)") public List getFilteredOrders(@Param(value = "filter") Filter filter); } 

Cela fonctionne parfaitement, mais pour une raison étrange, je n’ai pas encore compris, si vous activez le débogage SQL dans Hibernate et activez la journalisation du classeur, vous ne pourrez pas voir Hibernate lier cette expression aux variables de requête.

Veuillez utiliser la propriété ci-dessous dans application.properties logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE