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



假设有两个实体类型:Book(主键为bookId)和Author(主键为authorId)。作者写0…n的书。因此,AuthorBook中被@ManyToOne引用。

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

  1. SELECT b FROM Book b WHERE b.author = :author(实体作为参数)
  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驱动程序和Persistence Provider之间的附加层(简化),可以记录发送到数据库的所有查询及其参数。它还可以测量每个查询花费的时间,所以我认为它是性能测试的理想工具。

最新更新