previsto Ho un enum con una lista di stati (per esempio)Valore del parametro non corrisponde tipo
enum State
{
UP,
DOWN,
RETRY
};
La colonna nel mio database è di tipo enum. Quando provo ad eseguire una query di Hibernate impostando il parametro nella query utilizzando setParameter("keyword", State.RETRY);
, ricevo l'errore di
Valore del parametro [RIPROVA] non corrisponde previsto tipo [package.name.State (n/a)]
Nel mio server di Glassfish 4.1 per il mio dominio. Sto usando Hibernate 4.3.6.
Nel guardare il codice sorgente per Hibernate, vedo l'errore si verifica a causa di linee 958-960 in org.hibernate.jpa.spi.BaseQueryImpl
:
private static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType) {
if (expectedType.isInstance(value)) {
return true;
}
...
return false;
}
isValidBindValue
restituisce false e quindi ottengo il messaggio.
esso stampa la String
equivalente del valore a causa di questa linea enum
:
String.format("Parameter value [%s] did not match expected type [%s (%s)]",
bind,
parameterType.getName(),
extractName(temporalType)
)
Scopo bind
è convertito implicitamente al valore stringa chiamando il metodo toString
sul Object
che rappresenta il enum State.RETRY
.
Quindi, come posso convincere Hibernate che State.RETRY
è un'istanza di State
?
Sembra Hibernate aggiornato per l'APP 2.1 spec che è più severa in questo commit da aprile 2013:
https://github.com/hibernate/hibernate-orm/commit/84520cd6e36e9207c41528cf9311cae905a86425
L'entità è annotato come segue:
@Basic(optional = false)
@Column(name = "state")
@Enumerated(EnumType.String)
private State state;
Edit:
My RetryState
enum viene caricato dal EarLibClassLoader
. Mentre il Query
viene caricato da URLClassLoader e lo EntityManager
viene caricato da un caricatore di classi diverso.
Mostraci meglio come hai mappare che "parola chiave" di proprietà della vostra entità tramite annotazione - dovrebbe essere '@ Enumerated' btw – Antoniossss
@Antoniossss: Vedere la mia modifica – Brian
Sei sicuro che lo stato 'stato privato', si riferisce al enum corretto? Potresti aver importato quello sbagliato? – Tom