2012-01-12 11 views
5

Sto lavorando per passare il mio provider di persistenza JPA da EclipseLink 2.3 a Hibernate 3.6.5.Final. Il problema è con una query nativa. Nota: questo non era un problema con EclipseLink. Sto cercando di ottenere un valore scalare, un String da una tabella per la quale non ho dichiarato un'entità. Ecco il codice:getSingleResult restituisce il proxy sulla query scalare nativa in sospensione

Query q = em.createNativeQuery("select description from foo where foo_id = ?"); 
q.setParameter(1, fooId); 
String description = (String)q.getSingleResult(); 

con Hibernate ottengo un ClassCastException perché l'oggetto restituito è in realtà un oggetto proxy. Non so di che tipo si tratta, ma so che non è un array (object.getClass().isArray() è falso) e so che non è un elenco (object instanceof List è false).

Cosa mi manca?

+0

Quali interfacce restituisce 'q.getSingleResult(). GetClass(). GetInterfaces()'? –

+0

Ahhh ... era quello di cui avevo bisogno. È di tipo java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob e java.io.Serializable. Se lo fai una risposta, lo accetto. Non mi ero nemmeno reso conto che la colonna fosse un clob e sono sorpreso che EclipseLink stia facendo la conversione in String per me. – Ryan

+0

felice di poterti aiutare! –

risposta

4

sintesi delle osservazioni al di sotto della domanda:

Quali interfacce fa q.getSingleResult().getClass().getInterfaces() ritorno?


Esso è di tipo java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob e java.io.Serializable. [...] non ho nemmeno capito la colonna era un CLOB e sono sorpreso EclipseLink stava facendo la conversione in stringa per me


Sembra EclipseLink è abbastanza intelligente per convertire CLOB (che è in realtà una sequenza molto lunga di caratteri, come String) a String se necessario. Con Hibernate questo deve essere fatto esplicitamente. Immagino che questo sia conforme alle specifiche JPA.

0

Hai configurato il dialetto database corretto per la sospensione? Il dialetto viene utilizzato per mappare il tipo di valori scalari.

+0

Sto utilizzando un database Oracle e l'ho configurato in un DataSource nel mio server delle applicazioni. Quando Hibernate si inizializza, riporta nei log - Uso del dialetto: org.hibernate.dialect.Oracle10gDialect quindi immagino lo abbia capito. – Ryan

Problemi correlati