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

时间:2015-01-21 10:53:16

标签: spring jpa spring-data spring-data-jpa

部署应用程序并生成SQL时,JPA @NamedQuery仅转换为SQL一次。 每次调用我们的方法时,EntityManager.createQuery都会转换查询。

Spring-data-jpa使用@Query注释中定义的查询做了什么?是否在部署期间(如NamedQuery)将其翻译为SQL或每次翻译(如动态查询)?

1 个答案:

答案 0 :(得分:1)

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

尽管如此,大多数JPA持久性提供程序仍然执行某种基于文本的查询缓存,这样它们基本上可以为某个JPQL查询构建一次实际的SQL查询,并在后续调用中重用前者。

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