当前位置: 首页 > 知识库问答 >
问题:

如何在使用@Cacheable注释时停止对id的默认查询

翟凯
2023-03-14

当使用@cacheable注释(org.springframework.cache.annotation.cacheable)对带有自定义键(如name)的存储库时,会遇到在每个连续请求上运行额外的id字段查询的问题。

请参见下面的存储库代码:

public interface StatusRepository extends JpaRepository<Status, Integer> {

    @Cacheable(value = "StatusByStatusNameCache" , key="#statusName")
    public Status findByStatusName(String statusName);

}
Hibernate: select status0_.status_id as status_i1_7_, status0_.status_name as status_n2_7_ from status status0_ where status0_.status_name=?
Hibernate: select event0_.event_id as event_id1_3_, event0_.event_name as event_na2_3_ from events event0_ where event0_.event_name=?
Hibernate: select event_.event_id, event_.event_name as event_na2_3_ from events event_ where event_.event_id=?
Hibernate: select requestcha_.request_channel_id, requestcha_.request_channel_name as request_2_6_ from request_channels requestcha_ where requestcha_.request_channel_id=?
Hibernate: select status_.status_id, status_.status_name as status_n2_7_ from status status_ where status_.status_id=?

共有1个答案

楚丰羽
2023-03-14

Spring的@cacheable注释完全独立于Hibernate/您的JPA实现提供的任何缓存。

缓存按名称查询的结果不会阻止按id查询,因为id查询的缓存将由JPAs第一级缓存完成,它不知道也不关心Springs缓存。

以下是可能发生的事情:

实体从一级缓存中获得服务。

会话结束。

实体从一级缓存中删除

findbyname

注意Oliver Drotbohm似乎有不同的意见。

 类似资料:
  • 我正在从下面的方法中获取电影列表,并带有@Cacheable注释。由于它没有任何参数,我将key设置为#root.method.name。 现在,我想添加一个新的电影,同样应该添加到上述缓存。 我试过这个,但它给了我例外。 我们可以在这里使用@CachePut注释,还是有其他方法?

  • 我是新来的Spring。当我运行一个Spring批处理应用程序时,我希望只看到“Hello World!”,但相反,我得到了以下附加细节-

  • 我有一个父pom,它为我的其他组件提供所需的版本号变量 您必须使用分类器将补充工件附加到项目中,而不是替换它们 我发现这是因为jar打包固有的maven jar插件默认绑定,但我正在进行war打包,所以在war打包之后,默认jar执行开始并抛出上面的一个。任何停止违约的解决方案都将帮助我提前感谢。

  • 是否可以使用@请求参数为对象赋予默认值? 当我将表单标记命名为对象中的字段时,我知道它会自动为对象分配值。但如果对象的字段是int,则输入空值,则会发生错误。 ★Plant_list2VO类 ★ 形式 ★控制器: ★控制台:

  • 我使用Spring Framework的注释创建了一个简单的计划任务。 我知道可以有一个选择在这个方法开始时检查一个条件标志,但这不会停止这个方法的执行。 Spring提供了什么来停止任务吗?

  • 问题内容: 我正在使用logstash将日志输入ElasticSearch。我将logstash输出配置为: 我注意到,一旦启动logstash,它就会在ES中创建一个映射(日志),如下所示。 如何防止Logstash创建此映射? 更新: 我现在也解决了此错误。 “ [logs]的对象映射试图解析为对象,但是得到了EOF,是否提供了具体的价值?” 正如John Petrone在下面所述,定义映射后