Dobrý den, v poslední části článku se používá native query např. takto:
Query q = em.createNativeQuery(NATIVE_SQL);
Trochu jsem si stím hrál a narazil jsem na problém, který se mi nepodařilo vyřešit (resp. nikde jsem nenalezl odpověď).
Představte si, že chci z tabulky hlasovani vypsat všechny ip_adresa.
Vytvořím select : SELECT ip_adresa as ip from hlasovani
potom si nechám vrátit list
List<Object[]> result = q.getResultList();
problém nastáva, když chci vypysovat jednotlivé adresy
for (Object[] row : result) {
if(row[0] instanceof Character){
Sysout…(„to snad neni mozne“);bohuzel realita
}
}
- objekty, které jsou uloženy v řádcích (row) jsou typu Character, nikoli jak jsem předpokládal String. Zjednodušeně řečeno se do nich uloží jen první znak ip_adresy. Přetypování samozřejmě nefunguje.
V Hibernatu se tento problém řeší poměrně jednoduše:
SQLQuery q = hibernateSession.createSQLQuery(NATIVE_SQL);
q.addScalar( „ip“, Hibernate.STRING);nastaví se typ výsledku
a v listu je pak doopravdy objekt typu String. V JPA jsem tuto možnost nenašel. Pokud se scalar v Hibernatu nenastaví, opět defaultně vrací Character.
Možná se to může zdát jako blbost a někdo bude namítat, proč si rovnou nenechám vrátit entitu hlasovani, nebo proč to nevyřeším v JPQL, ale pokud dělám složitější selecty, kde chci využít databázových funkcí a vybírám data např. z 5 tabulek a potřebuju je pohromadě vypsat, tak je JPQL dost neefektivní oproti native (query). (dále to nebudu rozpitvávat)
Konkrétní problém mám v Hiberntate 3.4 – 3.5 JPA impl a DB Oracle 10g s tabulkovými atributy typu CHAR a VARCHAR.
Pokud znáte nějaké jednoduché řešení dejte prosím vědět, jinak velice pěkný článek.