假设有两种实体类型:(Book
具有主键bookId
)和Author
(具有主键authorId
)。作者写0 ... n本书。因此Author
在Book
使用中被引用@ManyToOne
。
如果要检索某个作者撰写的所有书籍,可以在JPQL中做两件事(例如NamedQuery):
SELECT b FROM Book b WHERE b.author = :author
(实体作为参数)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提供了option hibernate.show_sql
)。第二种选择(我认为更好)是使用诸如log4jdbc
JDBC驱动程序和Persistence Provider之间的附加层(简化)之类的工具,并且可以记录所有发送到数据库的查询及其参数。它还可以衡量每个查询所花费的时间,因此我认为它是性能测试的理想工具。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句