Hibernate如何知道要使用哪个查询缓存?

时间:2015-02-19 04:10:27

标签: java hibernate caching jpa hibernate-4.x

当使用Hibernate支持的JPA API并启用查询缓存时,Hibernate如何知道用于java.persistence.Query实例的查询缓存?

我已经读过,要启用Query q的查询缓存,您应该调用q.setHint(“org.hibernate.cacheable”, true)

根据我对JPA的了解,您应该在每次需要运行查询时调用Query q来获取EntityManager#createQuery(String qlString),而不是保存返回的Query变量并重用它。因此,如果为特定的Query实例启用查询缓存,然后丢弃它,Hibernate如何确定用于新创建的Query的缓存?它可以基于:

  1. qlString参数
  2. 的区分大小写的字符串比较
  3. qlString参数
  4. 的不区分大小写的字符串比较
  5. 查询的一些逻辑表示的比较(在这种情况下,"select t from table t where t.a = :a and t.b = :b"将使用与"select t from table t where t.b = :b and t.a = :a"相同的查询缓存,而在字符串比较方式中,交换两个的顺序条件将导致使用不同的查询缓存)
  6. 其他一些机制
  7. 作为对比,在EclipseLink中,您只能为命名查询启用查询结果缓存,可以通过createNamedQuery(String name)createNamedQuery(String name, Class<T> resultClass)方法获取。在这种情况下,显而易见的是,使用的查询结果缓存由传递给name方法的createNamedQuery的值确定。

0 个答案:

没有答案