我正在将JPA持久性提供程序从EclipseLink 2.3切换到Hibernate 3.6.5.Final。问题出在本机查询上。注意:这不是EclipseLink的问题。我试图String从我没有为其声明实体的表中获取一个标量值。这是代码:
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()是false),我也不是列表(object instanceof Listis false)。
ClassCastException
object.getClass().isArray()
object instanceof List
false
我想念什么?
总结问题下方的评论:
q.getSingleResult().getClass().getInterfaces()返回什么接口?
q.getSingleResult().getClass().getInterfaces()
这类型的java.sql.Clob,org.hibernate.engine.jdbc.WrappedClob和java.io.Serializable。[…]我什至没有意识到该列是Clob,我很惊讶EclipseLink为我执行了到String的转换
java.sql.Clob
org.hibernate.engine.jdbc.WrappedClob
java.io.Serializable
看起来EclipseLink很聪明,可以根据需要将CLOB(实际上是一个很长的字符序列,就像String)转换为String。使用Hibernate必须明确地做到这一点。我猜这符合JPA规范。