sql >> Database teknologi >  >> RDS >> Oracle

Dvale native forespørgsel - char(3) kolonne

Det ser ud til, at Hibernate læser værdi af typen CHAR(n) som Character . Prøv at caste det til VARCHAR(n) :

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

Når du bruger Hibernate via Session grænseflade, kan du udtrykkeligt indstille en type resultat med addScalar() i stedet (også tilgængelig via unwrap() i 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);

Der er masser af uløste problemer relateret til dette problem i Hibernate JIRA, startende fra HHH-2220.

Her er en forklaring af Max Rydahl Andersen fra HHH-2220's kommentarer:

I øjeblikket understøtter Hibernate en slags "automagisk" kortlægning fra SQL-typer til Hibernate/Java-typer - på grund af de mange tvetydigheder i at udføre en sådan kortlægning vil det nogle gange ikke matche, hvad du faktisk ønsker.

Derfor anbefaler vi altid at bruge eksplicit addScalar ELLER, hvis du ikke ønsker det over hele din kode, brug underklassificeringen af ​​Dialect til at diktere, hvilken af ​​de mange mulige tilknytninger du ønsker.

Problemet med CHAR er det mest problematiske, men det er ikke nemt at løse - vi ville have brug for en registerType(type, fra, til, typenavn) til at kortlægge et område i stedet for en bestemt længde...men selv da kunne du støde til at kortlægge tvetydigheder (f.eks. engang vil du have en matrix andre gange streng osv.) Derfor anbefales det at bruge .addScalar til enhver native sql-forespørgsel - afhængig af automatisk opdagelse vil det altid være risikabelt og bør kun bruges til et minimum.

Hvis du har din oprindelige forespørgsel beskrevet i Hibernate mappings konfigurationsfil, så skal du definere <return-scalar ...> for hver returneret værdi. Bemærk:Du skal opregne alle returnerede værdier, da når du definerer returtyperne eksplicit, er autodiscovery slået fra, og kun erklærede kolonner returneres.

<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>



  1. Sortering af array-elementer

  2. Kan ikke åbne databasen i læse-/skrivetilstand

  3. Sådan vedligeholdes rækkefølgen af ​​indsættelse i SQL Server

  4. Operand bør indeholde 1 kolonne - MySQL NOT IN