getSingleResult возвращает прокси на собственный скалярный запрос в спящем режиме - PullRequest
6 голосов
/ 13 января 2012

Я работаю над переключением моего поставщика сохраняемости JPA с EclipseLink 2.3 на Hibernate 3.6.5.Final.Проблема с собственным запросом.Примечание: это не было проблемой с EclipseLink.Я пытаюсь получить скалярное значение, String из таблицы, для которой у меня нет объявленной сущности.Вот код:

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

С Hibernate я получаю ClassCastException, потому что возвращаемый объект на самом деле является прокси-объектом.Я не знаю, какой это тип, но я знаю, что это не массив (object.getClass().isArray() - ложь), и я знаю, что это не список (object instanceof List - false).* Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Обобщая комментарии под вопросом:

Какие интерфейсы q.getSingleResult().getClass().getInterfaces() возвращает?


Это извведите java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob и java.io.Serializable.[...] Я даже не осознавал, что столбец был сабом, и я удивлен, что EclipseLink делал для меня преобразование в String


Похоже, EclipseLink достаточно умен для преобразованияCLOB (на самом деле это очень длинная последовательность символов, например String) до String, если требуется.С Hibernate это должно быть сделано явно.Я предполагаю, что это соответствует спецификации JPA.

0 голосов
/ 13 января 2012

Вы настроили правильный диалект базы данных для спящего режима?Диалект используется для отображения типа скалярных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...