sql >> Databáze >  >> RDS >> Oracle

Nativní dotaz hibernace – sloupec char(3).

Vypadá to, že Hibernate čte hodnotu typu CHAR(n) jako Character . Zkuste to přenést do VARCHAR(n) :

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

Při použití režimu spánku prostřednictvím Session rozhraní, můžete explicitně nastavit typ výsledku pomocí addScalar() místo toho (také dostupné přes unwrap() v 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);

Existuje spousta nevyřešených problémů souvisejících s tímto problémem v Hibernate JIRA, počínaje HHH-2220.

Zde je vysvětlení Maxe Rydahla Andersena z komentářů HHH-2220:

V současné době Hibernate podporuje jakési „automatické“ mapování z typů SQL na typy Hibernate/Java – kvůli mnoha nejasnostem při provádění takového mapování někdy nebude odpovídat tomu, co skutečně chcete.

Proto vždy doporučujeme použít explicitní addScalar NEBO, pokud nechcete, aby celý váš kód používal podtřídu Dialect k diktování, které z více možných mapování chcete.

Problém s CHAR je nejproblematičtější, ale není snadné jej opravit - potřebovali bychom registerType (typ, od, do, název typu) k mapování rozsahu místo konkrétní délky...ale i tak byste mohli narazit do mapování nejednoznačností (např. někdy chcete pole, jindy řetězec atd.) Proto je použití .addScalar doporučeno pro jakékoli nativní dotazování SQL - v závislosti na automatickém zjišťování bude vždy riskantní a mělo by být používáno jen minimálně.

Pokud máte svůj nativní dotaz popsaný v konfiguračním souboru mapování Hibernate, musíte definovat <return-scalar ...> pro každou vrácenou hodnotu. Poznámka:Musíte vyčíslit všechny vrácené hodnoty, protože když explicitně definujete návratové typy, automatické zjišťování se vypne a vrátí se pouze deklarované sloupce.

<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. Změny GI 12.2

  2. Ukládání souboru do databáze na rozdíl od systému souborů?

  3. Jak používat proměnnou tabulky v dynamickém příkazu SQL?

  4. Vylepšení dělení v PostgreSQL 11