2012-01-12 8 views
5

Pracuję nad przełączeniem mojego dostawcy utrwalania JPA z EclipseLink 2.3 na Hibernate 3.6.5.Final. Problem dotyczy rodzimego zapytania. Uwaga: nie było problemu z EclipseLink. Próbuję uzyskać wartość skalarną, String z tabeli, dla której nie zadeklarowano jednostki. Oto kod:getSingleResult zwraca proxy na natywne zapytanie skalarne w hibernacji

Query q = em.createNativeQuery("select description from foo where foo_id = ?"); 
q.setParameter(1, fooId); 
String description = (String)q.getSingleResult(); 

Hibernate dostaję ClassCastException ponieważ obiekt zwrócony jest w rzeczywistości obiekt proxy. Nie wiem, jaki to jest typ, ale wiem, że to nie jest tablica (object.getClass().isArray() to fałsz) i wiem, że to nie jest lista (object instanceof List is false).

Czego mi brakuje?

+0

Jakie interfejsy używa 'q.getSingleResult(). GetClass(). GetInterfaces()' return? –

+0

Ahhh ... to było to, czego potrzebowałem. Jest to typ java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob i java.io.Serializable. Jeśli odpowiesz, przyjmuję to. Nawet nie zdawałem sobie sprawy, że kolumna jest klonem i jestem zaskoczony, że EclipseLink dokonał konwersji na String. – Ryan

+0

cieszę się, że mogę pomóc! –

Odpowiedz

4

Podsumowywanie komentarze poniżej pytania:

Jakie interfejsy robi q.getSingleResult().getClass().getInterfaces() zwrot?


Jest typu java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob, a java.io.Serializable. [...] I nie zdaje sobie sprawy, kolumna była CLOB i jestem zaskoczony EclipseLink robi konwersję na ciąg dla mnie


Wygląda EclipseLink jest wystarczająco inteligentny, aby przekształcić CLOB (co w rzeczywistości jest bardzo długim ciągiem znaków, tak jak String) do String, jeśli jest to wymagane. W przypadku hibernacji należy to zrobić jawnie. Sądzę, że jest to zgodne ze specyfikacją JPA.

0

Czy skonfigurowałeś odpowiedni dialekt bazy danych do hibernacji? Dialekt służy do mapowania rodzaju wartości skalarnych.

+0

Używam bazy danych Oracle i mam to skonfigurowane w DataSource na moim serwerze aplikacji. Po zainicjowaniu hibernacji raportuje w dziennikach - przy użyciu dialektu: org.hibernate.dialect.Oracle10gDialect, więc domyślam się, że to się udało. – Ryan

Powiązane problemy