我正在将JPA持久性提供程序从EclipseLink 2.3切换到Hibernate
3.6.5.Final。问题出在本机查询上。注意:这不是EclipseLink的问题。我试图String
从我没有为其声明实体的表中获取一个标量值。这是代码:
Query q = em.createNativeQuery("select description from foo where foo_id = ?");
q.html" target="_blank">setParameter(1, fooId);
String description = (String)q.getSingleResult();
使用Hibernate会得到一个,ClassCastException
因为返回的对象实际上是一个代理对象。我不知道它是什么类型,但是我知道它不是数组(object.getClass().isArray()
是false),我也不是列表(object instanceof List
is false
)。
我想念什么?
总结问题下方的评论:
q.getSingleResult().getClass().getInterfaces()
返回什么接口?
这类型的
java.sql.Clob
,org.hibernate.engine.jdbc.WrappedClob
和java.io.Serializable
。[…]我什至没有意识到该列是Clob,我很惊讶EclipseLink为我执行了到String的转换
看起来EclipseLink很聪明,可以根据需要将CLOB(实际上是一个很长的字符序列,就像String
)转换为String
。使用Hibernate必须明确地做到这一点。我猜这符合JPA规范。
问题内容: 我想按数据库中的条件计数记录数。 我尝试使用下一个查询 但是没有方法可以执行此操作并获得结果。 我知道,我可以使用 所以问题是,查询是否具有更高的性能?如果,那么如何执行查询呢? 问题答案: 您可以通过调用来执行第一个查询,例如。 如果要将计数分配给变量,则需要将其转换为适当的类型(它可以取决于DB,但很可能是Long)。第二个查询效率很低,因为Hibernate需要从数据库中检索整个
问题内容: 尝试使用本机SQL更新数据时出现此错误。这是我的脚本: 是包含多个这样的字符串: 当我更新(使用)时,会引发以下错误: 请求处理失败;嵌套的异常是org.hibernate.exception.DataException:无法执行本机批量操作查询],根本原因是com.mysql.jdbc.MysqlDataTruncation:数据截断:截断了错误的DOUBLE值:‘222,226,2
问题内容: sess.createSQLQuery(“INSERT INTO ARCHIVE (folder) VALUES(:folder)”) .setParameter(“folder”,path) .executeUpdate(); 我想要新创建对象的ID。我怎样才能做到这一点? 问题答案: 试试吧 Integer lastId = (Integer) session.createSQLQ
问题内容: 我在使用Hibernate创建子查询时遇到问题。不幸的是Subqueries类几乎完全没有文档,因此我完全不知道如何将以下SQL转换为Hibernate Criteria: 我希望以下内容能够“正常工作”: 但不幸的是,事实并非如此。因此,看来我实际上必须使用Subqueries类来创建Criteria。但是我无法通过Google找到一个合理的例子,因此这使我在这里提出了疑问。 问题答
问题内容: 当我尝试从数据库中删除条目时,使用 然后我可以执行以下操作: 1)如果该行存在于数据库中,则将执行两个SQL查询:一个选择,然后一个删除 2)如果数据库中不存在该行,则仅执行选择查询 但是同样,更新不是这种情况。无论是否存在数据库行,都只会执行更新查询。 请让我知道为什么这种行为用于删除操作。这不是性能问题,因为遇到了两个查询而不是一个查询? 编辑: 我正在使用休眠3.2.5 样例代码
问题内容: 当我使用sqldeveloper在oracle 10g中运行这样的查询时,它运行良好。 给我名字和国家。当我在hibernate状态下将其作为命名查询运行时,对于“国家/地区”,我只会得到“ C”而不是“加拿大”。 为什么会这样呢? 问题答案: