【发布时间】:2013-03-24 05:50:52
【问题描述】:
我有下面的代码 sn-p 我正在使用休眠查询。它工作正常。当我触发第二次执行此代码时 时间查询不会被触发,因为它是从查询缓存中挑选出来的
Session session = hibernateFactory.openSession();
Query employeeQuery=session.createQuery("from Employee where employeeId=1");//line 1
employeeQuery.setCacheable(true);
Employee employee1=(Employee)employeeQuery.uniqueResult();
session.close();
但是一旦我将上面代码 sn-p 中的 line1 替换为下面的行,我就会得到异常
Query employeeQuery=session.createSQLQuery("select * from Employee where employeeId=1");
执行是
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.type.TypeHelper.disassemble(TypeHelper.java:146)
at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:106)
at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2434)
at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2321)
at org.hibernate.loader.Loader.list(Loader.java:2268)
查询缓存是否不适用于原生查询?
更新:- 我认为查询缓存适用于 HQL 而不是 Native SQL。但是在休眠文档中它没有写在任何地方。所以只是想知道我在这里遗漏了什么
【问题讨论】:
-
你能试试添加标量吗?从异常看来,将结果转换为对象时似乎失败了。 docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
-
但是当我使用列别名并想要指定别名类型时,需要添加Scalar。如果我没有使用任何别名,我不需要提及它们吧?
-
你是对的。在这种情况下,Hibernate 应该使用
ResultSetMetadata。但是,如果缓存中不支持 SQL 查询,那么 Hibernate 不应该首先查看缓存。看起来好像必须通过一些怪癖来完成。也许试试标量。您使用的是哪个 Hibernate 版本? -
或者您可以尝试stackoverflow.com/questions/25789176/…中描述的这种解决方法/解决方案