getSingleResult возвращает прокси на собственный скалярный запрос в спящем режиме

Я работаю над переключением моего поставщика сохраняемости 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 ответа

Решение

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

Какие интерфейсы делает q.getSingleResult().getClass().getInterfaces() вернуть?


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


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

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

Другие вопросы по тегам