私のアプリケーションでは、JPA (1.2)、Spring (3.1.2)、Spring Data (1.1.0)、および Hibernate (4.1.7) を使用しています。データベース: Oracle10g
2 番目のレベルのキャッシュを有効にしました。エンティティでは問題なく動作していますが、名前付きクエリのキャッシュで問題が発生しています。
問題は次のとおりです。名前付きクエリに同じwhere句があり、selectステートメントが異なる場合、最初のクエリが実行されても、2番目のクエリでも同じ結果が得られます。
私の最初のクエリ(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
そして2番目のクエリ(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
最初のクエリが最初に実行された場合、カウントが発生し、その後、2 番目のクエリを実行した場合もカウントが発生し、リリース エンティティのリストが表示されます。
クエリ キャッシュを削除すると正常に動作し、2 番目のクエリの 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"/>