sql >> Base de Datos >  >> RDS >> Oracle

Consulta nativa de Hibernate - columna char(3)

Parece que Hibernate lee el valor del tipo CHAR(n) como Character . Intenta enviarlo a VARCHAR(n) :

Query q2 = em.createNativeQuery(
    "select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");  

Al usar Hibernate a través de Session interfaz, puede establecer explícitamente un tipo de resultado con addScalar() en su lugar (también accesible a través de unwrap() en JPA 2.0):

Query q2 = em.createNativeQuery(
    "select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);

Hay muchos problemas sin resolver relacionados con este problema en Hibernate JIRA, a partir de HHH-2220.

Aquí hay una explicación de Max Rydahl Andersen de los comentarios de HHH-2220:

Actualmente, Hibernate admite una especie de mapeo "automágico" de tipos SQL a tipos Hibernate/Java; debido a las muchas ambigüedades al hacer dicho mapeo, en ocasiones no coincidirá con lo que realmente desea.

Es por eso que siempre recomendamos usar addScalar explícito O, si no desea eso en todo su código, use la subclase de Dialecto para dictar cuál de las múltiples asignaciones posibles desea.

El problema con CHAR es el más problemático, pero no es fácil de arreglar:necesitaríamos un tipo de registro (tipo, desde, hasta, nombre de tipo) para mapear un rango en lugar de una longitud específica... en ambigüedades de mapeo (p. ej., a veces desea una matriz, otras veces una cadena, etc.). Por lo tanto, se recomienda usar .addScalar para cualquier consulta SQL nativa; dependiendo del descubrimiento automático, siempre será riesgoso y solo debe usarse al mínimo.

Si tiene su consulta nativa descrita en el archivo de configuración de asignaciones de Hibernate, entonces necesita definir <return-scalar ...> por cada valor devuelto. Nota:debe enumerar todos los valores devueltos, ya que cuando define los tipos de devolución de forma explícita, la detección automática se desactiva y solo se devuelven las columnas declaradas.

<sql-query name="myQuery">
    <query-param name="days" type="int" />
    <return-scalar column="count" type="int" />
    <return-scalar column="section_name" type="string" />
    <![CDATA[select count(id) as count, section_name from document where days <= :days]]>
</sql-query>