Hibernate query nativa – char (3) colonna

Ho una tabella in Oracle dove la colonna SC_CUR_CODE è CHAR (3)

Quando io faccio:

Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs"); q2.setMaxResults(10); List rs2 = q2.getResultList(); for (Object[] o : rs2) { System.out.println(">>> cur=" + o[0]); } 

Vedo cur=E e cur=U invece di cur=EUR e da cur=USD

o[0] è un java.lang.Character

Come posso ottenere il valore completo di EUR e USD ?

    Sembra che Hibernate legga il valore di tipo CHAR(n) come Character . Prova a lanciarlo su VARCHAR(n) :

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

    Quando si utilizza Hibernate tramite l’interfaccia Session , è ansible impostare esplicitamente un tipo di risultato con addScalar() invece (accessibile anche tramite unwrap() in 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); 

    Ci sono molti problemi irrisolti relativi a questo problema in Hibernate JIRA, a partire da HHH-2220 .

    Ecco una spiegazione di Max Rydahl Andersen dai commenti di HHH-2220:

    Attualmente Hibernate supporta un tipo di mapping “automagic” dai tipi SQL ai tipi Hibernate / Java – a causa delle molte ambiguità nel fare tale mapping, a volte non corrisponderà a ciò che realmente si vuole.

    Questo è il motivo per cui raccomandiamo sempre di utilizzare esplicitamente addScalar OPPURE se non si desidera che tutto il tuo codice utilizzi la sottoclass di Dialect per dettare quale delle più possibili mappature vuoi.

    Il problema con CHAR è il più problematico, ma non è facile da risolvere: avremmo bisogno di un registerType (tipo, from, to, typename) per mappare un intervallo invece di una lunghezza specifica … ma anche allora potresti urti in mapping ambiguità (ad esempio, a volte si desidera un array altre volte stringa, ecc.) Quindi utilizzare .addScalar è raccomandato per qualsiasi query SQL nativa – a seconda del rilevamento automatico sarà sempre rischioso e dovrebbe essere utilizzato solo al minimo.

    Se la query nativa è descritta nel file di configurazione dei mapping di Hibernate, è necessario definire per ogni valore restituito. Nota: è necessario enumerare tutti i valori restituiti, poiché quando si definiscono esplicitamente i tipi restituiti, l’autodiscovery viene distriggersto e vengono restituite solo le colonne dichiarate.