当使用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
的缓存?它可以基于:
qlString
参数qlString
参数"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"
相同的查询缓存,而在字符串比较方式中,交换两个的顺序条件将导致使用不同的查询缓存)作为对比,在EclipseLink中,您只能为命名查询启用查询结果缓存,可以通过createNamedQuery(String name)
或createNamedQuery(String name, Class<T> resultClass)
方法获取。在这种情况下,显而易见的是,使用的查询结果缓存由传递给name
方法的createNamedQuery
的值确定。