Java 如何使用容器管理的EntityManager在Spring中重用(本机)JPA查询

Java 如何使用容器管理的EntityManager在Spring中重用(本机)JPA查询,java,sql,spring,hibernate,jpa,Java,Sql,Spring,Hibernate,Jpa,我正在使用Spring+JPA(Hibernate),并执行本机SQL查询。 查询内置于代码中,但始终相同,因此可以重用 我想要的是像旧的JDBC PreparedStatement一样重用它,希望这能给我带来一些神奇的性能改进,因为数据库可以重用执行计划或类似的东西 因此,我的服务bean看起来像: @服务 公共类服务{ @自动连线字符串Todayscret; @持久上下文 私人实体管理者实体管理者; public void makeTea(最终字符串teaType){ 最后一个字符串quer

我正在使用Spring+JPA(Hibernate),并执行本机SQL查询。 查询内置于代码中,但始终相同,因此可以重用

我想要的是像旧的JDBC PreparedStatement一样重用它,希望这能给我带来一些神奇的性能改进,因为数据库可以重用执行计划或类似的东西

因此,我的服务bean看起来像:

@服务
公共类服务{
@自动连线字符串Todayscret;
@持久上下文
私人实体管理者实体管理者;
public void makeTea(最终字符串teaType){
最后一个字符串querySql=“从表中选择茶”+todayscret+“其中类型=:teaType”;
entityManager.createNativeQuery(querySql).setParameter(“teaType”,teaType.executeUpdate();
}
}
我想要的是:

@服务
公共类服务{
@自动连线字符串Todayscret;
@持久上下文
私人实体管理者实体管理者;
私有查询可重用查询;
@施工后
构造后的私有void(){
最后一个字符串querySql=“从表中选择茶”+todayscret+“其中类型=:teaType”;
reusableQuery=entityManager.createNativeQuery(querySql);
}
public void makeTea(最终字符串teaType){
reusableQuery.setParameter(“teaType”,teaType).executeUpdate();
}
}
这可能会“起作用”,但据我所知,查询实例不应该比创建它们的EntityManager活得更长,而使用@PersistenceContext注入的容器管理的EntityManager实际上是一个代理,其中容器可能会更新实际的EntityManager

那么正确的方法是什么呢?有可能吗? 在当前的“持久性上下文”中是否有存储查询的位置? 我是否需要另一个服务/bean/什么来管理这些可重用查询? @NamedNativeRequesty有点像我想要的,但只允许一个静态字符串,我的查询是非常静态的,但它确实需要以编程方式构建(一次)。我是否可以使用与命名查询相同的系统/存储

希望有人真正了解和理解这些东西:)


谢谢

你的意思是什么?看起来很像我想要的:)我会检查我的环境是否真的是JPA2.1:)