2012-01-12 11 views
5

Estoy trabajando para cambiar mi proveedor de persistencia JPA de EclipseLink 2.3 a Hibernate 3.6.5.Final. El problema es con una consulta nativa. Nota: esto no fue un problema con EclipseLink. Estoy tratando de obtener un valor escalar, un String de una tabla para la que no tengo una Entidad declarada. Aquí está el código:getSingleResult devuelve el proxy en la consulta escalar nativa en hibernación

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

con Hibernate me siento un ClassCastException porque el objeto devuelto es en realidad un objeto proxy. No sé de qué tipo es, pero sé que no es una matriz (object.getClass().isArray() es falsa) y sé que no es una lista (object instanceof List es false).

¿Qué me estoy perdiendo?

+0

¿Qué interfaces hace 'q.getSingleResult(). GetClass(). GetInterfaces()' return? –

+0

Ahhh ... eso era lo que necesitaba. Es de tipo java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob y java.io.Serializable. Si haces una respuesta, la aceptaré. Ni siquiera me di cuenta de que la columna era un clob y me sorprende que EclipseLink estuviera haciendo la conversión a String para mí. – Ryan

+0

¡me alegro de poder ayudar! –

Respuesta

4

resumen de los comentarios debajo de la pregunta:

qué interfaces hace q.getSingleResult().getClass().getInterfaces() cambio?


es de tipo java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob, y java.io.Serializable. [...] que ni siquiera cuenta de la columna era un CLOB y me sorprende EclipseLink estaba haciendo la conversión a cadena para mí


Parece que EclipseLink es lo suficientemente inteligente como para convertir CLOB (que es en realidad una secuencia de caracteres muy larga, como String) a String si es necesario. Con Hibernate esto debe hacerse de forma explícita. Supongo que esto cumple con la especificación JPA.

0

¿Ha configurado el dialecto de base de datos correcto para hibernar? El dialecto se usa para mapear el tipo de valores escalares.

+0

Estoy usando una base de datos Oracle y la configuré en un DataSource en mi servidor de aplicaciones. Cuando Hibernate lo inicializa, informa en los registros - Usando dialect: org.hibernate.dialect.Oracle10gDialect, así que supongo que lo descubrió. – Ryan

Cuestiones relacionadas