休眠二级查询缓存问题,具有相同的 where 子句
我的应用程序使用 JPA (1.2)、Spring (3.1.2)、Spring Data (1.1.0) 和 Hibernate (4.1.7)。数据库 : 甲骨文10g
我们启用了二级缓存。它对实体工作正常,但它在命名查询缓存上产生了问题。
问题是:如果命名查询具有相同的 where 子句但不同的 select 语句,则无论执行第一个查询时,它也会为第二个查询提供相同的结果。
就像我的第一个查询(countRelease)是
select count(r) from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
和第二个查询(查找发布)是
select r from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
如果首先运行第一个查询,那么计数将来临,之后如果我运行第二个查询,那么计数也会来,它应该给我发布实体的列表。
如果我删除查询缓存,它工作正常,如果我在第二个查询where子句中进行了一些更改,那么它也工作正常,但我不需要这样做。
我们如何解决这个问题?
我的 Java 代码
@Query(name="findRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public List<Release> findRelease();
@Query(name="countRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public Long countOfRelease(Date today);
缓存配置
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
<property name="hibernate.cache.provider_configuration_file_resource_path" value="ehcache.xml" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="ehcache.xml" p:shared="true"/>