2015-01-21 80 views
1

当部署应用程序并生成SQL缓存时,JPA @NamedQuery仅被转换为SQL一次。 每次调用我们的方法时,EntityManager.createQuery都会转换查询。是一个Spring Data JPA @Query动态还是命名?

Spring-data-jpa使用@Query注释中定义的查询处理什么?它是否在部署期间被翻译成SQL(如NamedQuery)或每次翻译(如动态查询)?

+0

spring-data-jpa不是JPA实现,所以它不会转换任何东西。也许只是查看JPA实现的日志会回答你的问题...... – 2015-01-21 11:10:49

+0

也有一些JPA实现缓存已编译的查询(即SQL),因此没有这种多重转换。你没有提到你的JPA实现是什么 – 2015-01-21 11:31:21

回答

1

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

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

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

相关问题