【发布时间】:2013-02-02 19:17:23
【问题描述】:
我的应用程序使用 JPA (1.2)、Spring (3.1.2)、Spring Data (1.1.0) 和 Hibernate (4.1.7)。 数据库:Oracle10g
我们已启用二级缓存。它在实体上运行良好,但在命名查询缓存上产生了问题。
问题是:如果命名查询具有相同的 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
第二个查询(findRelease)是
select r from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
如果首先运行第一个查询,那么 count 会出现,然后如果我运行第二个查询,那么 count 也会出现,它应该给我发布实体的列表。
如果我删除查询缓存,它可以正常工作,如果我在第二个查询 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"/>
【问题讨论】:
-
有没有人有解决上述问题的办法
-
有没有人有解决上述问题的方法...或其错误
-
QueryKey类似乎存储了查询字符串,所以这确实很奇怪。我会在QueryKey.generateQueryKey()上设置一个断点,并尝试找出为什么它的queryString参数对于两个不同的查询是相同的。 -
@Ranu Jain 最好把 Java 代码贴出来供审阅。代码说明了一切。我所知。二级缓存不会影响查询结果。这是另一个问题。
-
没有 java 代码,因为它只有 @namedQuery 的方法名称,因为我们使用的是 JPA 存储库
标签: java hibernate jpa spring-data spring-data-jpa