【问题标题】:Hibernate query cache applicable for native queries?适用于本机查询的休眠查询缓存?
【发布时间】: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/…中描述的这种解决方法/解决方案

标签: java hibernate


【解决方案1】:

SQLQuery 不支持缓存。它可以帮助你。

http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

最好使用hibernate SQL sintaxis。

【讨论】:

  • 我也认为查询缓存适用于 HQL 而不是 Native SQL。但是在休眠文档中它没有写在任何地方:(
猜你喜欢
  • 2020-04-08
  • 2013-01-18
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多