java - Consulta nativa de hibernación-columna char(3)
oracle hibernate (1)
Tengo una tabla en Oracle donde la columna SC_CUR_CODE es CHAR (3)
Cuando lo hago:
Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs");
q2.setMaxResults(10);
List<Object[]> rs2 = q2.getResultList();
for (Object[] o : rs2) {
System.out.println(">>> cur=" + o[0]);
}
Veo cur=E
y cur=U
lugar de cur=EUR
y cur=USD
o[0]
es un java.lang.Character
¿Cómo puedo obtener el valor total de EUR
y USD
?
Parece que Hibernate lee el valor del tipo CHAR(n)
como Character
. Intenta VARCHAR(n)
a VARCHAR(n)
:
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Cuando se utiliza Hibernate a través de la interfaz de Session
, puede establecer explícitamente un tipo de resultado con addScalar()
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 un tipo de asignación "automágica" de tipos de SQL a tipos de Hibernación / Java; debido a las muchas ambigüedades al realizar dicha asignación, a veces no coincidirá con lo que realmente desea.
Es por eso que siempre recomendamos usar addScalar explícito O si no desea que todo su código use la subclase de Dialect para determinar 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 solucionar: necesitaríamos un registerType (tipo, from, to, typename) para mapear un rango en lugar de una longitud específica ... pero incluso así podrías golpear en el mapeo de ambigüedades (p. ej., en algún momento usted desea una matriz otra vez, cadena, etc.) Por lo tanto, se recomienda el uso de .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 ...>
para cada valor devuelto. Nota: Debe enumerar todos los valores devueltos, ya que cuando define los tipos de retorno explícitamente, el autodiscovery está desactivado 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>