Spring Data JPA @Query 是动态的还是命名的?

Is a Spring Data JPA @Query dynamic or named?

JPA @NamedQuery 仅在部署和生成应用程序时转换为 SQL 一次 SQL 被缓存。 EntityManager.createQuery 每次调用我们的方法时翻译查询。

Spring-data-jpa 对@Query 注释中定义的查询做了什么?它是在部署期间转换为 SQL 一次(如 NamedQuery)还是每次都转换(如动态查询)?

Spring Data JPA 调用 EntityManager.createQuery(…) 每次调用用 @Query 注释的查询方法。原因很简单:EntityManager 返回的 Query 实例不是线程安全的,实际上是有状态的,因为它们包含绑定参数信息。

也就是说,大多数 JPA 持久性提供程序无论如何都会执行某种基于文本的查询缓存,因此它们基本上为某个 JPQL 查询构建一次实际的 SQL 查询,并在后续调用中重用前者.

作为一个有趣的旁注,当我们在 2008 年开始构建对 @Query 的支持时,我们研究了将手动声明的查询注册为 JPA 命名查询的可能性。不幸的是,直到今天,还没有办法通过 JPA 以编程方式手动注册命名查询。