如何解决如何在Spring中使用容器托管的EntityManager重用本机JPA查询
我正在使用Spring + JPA(休眠),并执行本机SQL查询。 该查询是用代码内置的,但始终相同,因此可以重用。
我想要的是与旧的JDBC PreparedStatement一样重用它,希望这可以给我带来神奇的性能改进,因为数据库可以重用执行计划或类似的东西。
所以我的服务bean看起来像:
@Service
public class TeaService {
@Autowired String todaysSecret;
@PersistenceContext
private EntityManager entityManager;
public void makeTea(final String teaType) {
final String querysql = "select tea from table" + todaysSecret + " where type = :teaType";
entityManager.createNativeQuery(querysql).setParameter("teaType",teaType).executeUpdate();
}
}
我想要的是这样的:
@Service
public class TeaService {
@Autowired String todaysSecret;
@PersistenceContext
private EntityManager entityManager;
private Query reusableQuery;
@postconstruct
private void postconstruct() {
final String querysql = "select tea from table" + todaysSecret + " where type = :teaType";
reusableQuery = entityManager.createNativeQuery(querysql);
}
public void makeTea(final String teaType) {
reusableQuery.setParameter("teaType",teaType).executeUpdate();
}
}
可能“起作用”,但据我所知,查询实例的寿命不应长于创建实例的EntityManager,并且使用@PersistenceContext注入的容器管理的EntityManager实际上是代理,容器可以在其中更新实际的EntityManager
那么正确的方法是什么?可能吗 当前的“持久性上下文”中是否有一些地方可以存储查询? 我是否需要其他服务/ bean /某些东西来管理这些可重复使用的查询? @NamednativeQuery还可以满足我的要求,但是只允许使用一个静态String,我的查询是相当静态的,但是确实需要以编程方式构建(一次)。也许可以使用与那些命名查询相同的系统/存储吗?
希望有人真正了解和理解这些东西:)
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。