sql >> Database >  >> RDS >> Oracle

Slaapstand native query - char (3) kolom

Het lijkt erop dat Hibernate de waarde van het type CHAR(n) . leest als Character . Probeer het te casten naar VARCHAR(n) :

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

Bij gebruik van Hibernate via Session interface, kunt u expliciet een type resultaat instellen met addScalar() in plaats daarvan (ook toegankelijk via 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);

Er zijn tal van onopgeloste problemen met betrekking tot dit probleem in Hibernate JIRA, vanaf HHH-2220.

Hier is een uitleg van Max Rydahl Andersen uit de opmerkingen van HHH-2220:

Momenteel ondersteunt Hibernate een soort "automagische" mapping van SQL-types naar Hibernate/Java-types - vanwege de vele dubbelzinnigheden bij het uitvoeren van dergelijke mapping zal het soms niet overeenkomen met wat je eigenlijk wilt.

Daarom raden we altijd aan om expliciet addScalar te gebruiken OF als je dat niet overal in je code wilt gebruiken, gebruik dan de subklasse van Dialect om te dicteren welke van de meerdere mogelijke toewijzingen je wilt.

Het probleem met CHAR is het meest problematische, maar het is niet eenvoudig op te lossen - we zouden een registerType (type, from, to, typename) nodig hebben om een ​​bereik toe te wijzen in plaats van een specifieke lengte... in het toewijzen van dubbelzinnigheden (bijv. soms wil je een array, andere keer een string enz.) Daarom wordt het gebruik van .addScalar aanbevolen voor native sql-query's - afhankelijk van automatische detectie zal altijd riskant zijn en zou slechts tot een minimum moeten worden gebruikt.

Als uw native query is beschreven in het configuratiebestand voor Hibernate-toewijzingen, moet u <return-scalar ...> definiëren voor elke geretourneerde waarde. Opmerking:u moet alle geretourneerde waarden opsommen, want wanneer u de retourtypen expliciet definieert, wordt autodiscovery uitgeschakeld en worden alleen gedeclareerde kolommen geretourneerd.

<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. Alle triggers in de SQL Server-database uitschakelen?

  2. Wat is het verschil tussen het gebruik van INDEX en KEY in MySQL?

  3. Wat is de equivalente PostgreSQL-syntaxis voor CONNECT BY... START WITH van Oracle?

  4. 4 manieren om meerdere rijen in Oracle in te voegen