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.
Вы настроили правильный диалект базы данных для спящего режима? Диалект используется для отображения типа скалярных значений.