Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Hibernacja natywnego zapytania — kolumna char(3)

Wygląda na to, że Hibernate odczytuje wartość typu CHAR(n) jako Character . Spróbuj przesłać go do VARCHAR(n) :

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

Podczas korzystania z Hibernacji przez Session interfejs, możesz wyraźnie ustawić typ wyniku za pomocą addScalar() zamiast tego (dostępne również przez unwrap() w 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);

Istnieje wiele nierozwiązanych problemów związanych z tym problemem w Hibernate JIRA, począwszy od HHH-2220.

Oto wyjaśnienie Maxa Rydahla Andersena z komentarzy HHH-2220:

Obecnie Hibernate obsługuje rodzaj "automatycznego" mapowania z typów SQL na typy Hibernate/Java - ze względu na wiele niejasności związanych z wykonaniem takiego mapowania czasami nie będzie ono odpowiadać temu, czego faktycznie chcesz.

Dlatego zawsze zalecamy użycie jawnego addScalar OR, jeśli nie chcesz, aby w całym kodzie używano podklas Dialect do dyktowania, które z wielu możliwych mapowań chcesz.

Problem z CHAR jest najbardziej problematyczny, ale nie jest łatwy do naprawienia - potrzebowalibyśmy registerType(type, from, to, typename) do mapowania zakresu zamiast określonej długości...ale nawet wtedy można by bump w niejednoznaczności mapowania (np. czasami chcesz tablicę, innym razem łańcuch itp.) Dlatego użycie .addScalar jest zalecane dla każdego natywnego zapytania sql - w zależności od automatycznego wykrywania zawsze będzie ryzykowne i powinno być używane tylko do minimum.

Jeśli masz natywne zapytanie opisane w pliku konfiguracyjnym Hibernate mappings, musisz zdefiniować <return-scalar ...> dla każdej zwróconej wartości. Uwaga:Musisz wyliczyć wszystkie zwracane wartości, ponieważ podczas jawnego definiowania zwracanych typów, automatyczne wykrywanie jest wyłączane i zwracane są tylko zadeklarowane kolumny.

<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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeksy Oracle i rodzaje indeksów w Oracle z przykładem

  2. Jak zainstalować Oracle na komputerze Mac

  3. Używanie setDate w PreparedStatement

  4. Co zrobić, jeśli podczas korzystania ze sterownika Easysoft Oracle ODBC w wersji OCI nie można otworzyć pliku obiektu współdzielonego?

  5. Rekurencja w zapytaniu do bazy danych w celu uzyskania wyniku hierarchicznego za pomocą Hibernate - Java