繁体   English   中英

JPA性能:实体或实体ID作为查询参数?

[英]JPA Performance: Entity or Entity Id as query parameter?

假设有两种实体类型: Book (带有主键bookId )和Author (带有主键authorId )。 一位作者写了0 ... n本书。 所以, Author在引用Book使用@ManyToOne

如果我们想要检索某个作者编写的所有书籍,我们可以在JPQL中做两件事(例如NamedQuery):

  1. SELECT b FROM Book b WHERE b.author = :author (entity as parameter)
  2. SELECT b FROM Book b WHERE b.author.authorId = :authorId (实体的主键ID作为参数)

在第一个选项中,我们必须注意传递的对象实际上是Author类型,并且它已经有一个主键。

但是:在上面提到的两个选项中,性能是否存在差异? 我猜(2)更便宜,但(1)可能更容易针对JPA提供商进行优化。 是否有关于此问题的性能测试或文献?

我们可以假设Author实例(我们想要搜索的书籍)已经被加载(例如,在响应中查看他/她的个人资料),因此没有额外的代码编写工作来传递整个对象或只是它的书籍搜索方法的ID。 但是执行速度有差异吗? 可能取决于使用的JPA提供商?

我测试了两个查询,结果sql是一样的。

回答你问题的第二部分 - 有很多相关的文献,但我特别推荐Pro JPA 2, 2nd Edition by Mike Keith , Merrick Schincariol

如果您需要手动执行测试查询,则可以查看JPA查询产生的SQL查询。 一种方法是了解您的JPA提供程序并查看他为此目的提供的选项(例如,Hibernate提供了选项hibernate.show_sql )。 第二个选项(在我看来 - 更好)是使用诸如log4jdbc工具,它是JDBC驱动程序和持久性提供程序之间的附加层(简化),并且可以记录发送到数据库的所有查询及其参数。 它还可以测量每个查询的时间花费,因此我认为它是性能测试的理想工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM