部署应用程序并生成SQL时,JPA @NamedQuery仅转换为SQL一次。 每次调用我们的方法时,EntityManager.createQuery都会转换查询。
Spring-data-jpa使用@Query注释中定义的查询做了什么?是否在部署期间(如NamedQuery)将其翻译为SQL或每次翻译(如动态查询)?
答案 0 :(得分:1)
Spring Data JPA在每次调用使用EntityManager.createQuery(…)
注释的查询方法时调用@Query
。原因很简单:Query
返回的EntityManager
实例不是线程安全的,实际上是有状态的,因为它们包含绑定参数信息。
尽管如此,大多数JPA持久性提供程序仍然执行某种基于文本的查询缓存,这样它们基本上可以为某个JPQL查询构建一次实际的SQL查询,并在后续调用中重用前者。
作为一个有趣的附注,当我们在2008年开始构建对@Query
的支持时,我们研究了将手动声明的查询注册为带有JPA的命名查询的可能性。不幸的是,直到今天还没有办法通过JPA以编程方式手动注册命名查询。