微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Spring中使用容器托管的EntityManager重用本机JPA查询

如何解决如何在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 举报,一经查实,本站将立刻删除。