sql >> Databasteknik >  >> RDS >> Oracle

Hibernate native query - kolumn char(3).

Det ser ut som att Hibernate läser värde av typen CHAR(n) som Character . Försök att casta den till VARCHAR(n) :

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

När du använder Hibernate via Session gränssnitt, kan du uttryckligen ställa in en typ av resultat med addScalar() istället (även tillgänglig 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);

Det finns massor av olösta problem relaterade till detta problem i Hibernate JIRA, från HHH-2220.

Här är en förklaring av Max Rydahl Andersen från HHH-2220:s kommentarer:

För närvarande stöder Hibernate en sorts "automagisk" mappning från SQL-typer till Hibernate/Java-typer - på grund av de många oklarheterna i att göra sådan mappning kommer den ibland inte att matcha vad du faktiskt vill ha.

Det är därför vi alltid rekommenderar att du använder explicit addScalar ELLER om du inte vill ha det i hela din kod använd underklassningen av Dialect för att diktera vilken av de flera möjliga mappningarna du vill ha.

Problemet med CHAR är det mest problematiska, men det är inte lätt att fixa - vi skulle behöva en registerType(typ, från, till, typnamn) för att kartlägga ett område istället för en specifik längd...men även då kan du stöta i kartläggning av oklarheter (t.ex. någon gång du vill ha en array andra gånger sträng etc.) Därför rekommenderas att använda .addScalar för alla inbyggda sql-förfrågningar - beroende på automatisk upptäckt kommer det alltid att vara riskabelt och bör endast användas till ett minimum.

Om du har din inbyggda fråga beskriven i Hibernate-mappningskonfigurationsfilen måste du definiera <return-scalar ...> för varje värde som returneras. Obs:Du måste räkna upp alla returnerade värden, eftersom när du definierar returtyperna explicit, stängs autodiscovery av och endast deklarerade kolumner returneras.

<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. Anslut ODBC-applikationer på Windows till Zoho CRM

  2. Uppgradering av SQL Server Data Platform 2015

  3. Hur kör man två mysql-frågor som en i PHP/MYSQL?

  4. Behöver ordna anställdas namn enligt deras stad kolumnvis