我是Hibernate的初学者。在where子句中使用ID或Object时,我感到很困惑(合理,性能,优化)。
例:
from Post p where p.category.id = :cid
要么
from Post p where p.category = :category
感谢帮助我!
答案 0 :(得分:0)
一般来说,两者之间没有重大区别。更多的时候,使用的语法通常基于您进入HQL / JPQL的任何输入。
所有这些都是有效的:
// Category instance available
List<Post> posts = session
.createQuery( "FROM Post p WHERE p.category = :category", Post.class )
.setParameter( "category", category )
.getResultList();
// Category id available
List<Post> posts = session
.createQuery( "FROM Post p WHERE p.category.id = :categoryId", Post.class )
.setParameter( "categoryId", categoryId )
.getResultList();
// Category instance generated by Session#load with categoryId as input
final Category category = session.load( Category.class, categoryId );
List<Post> posts = session
.createQuery( "FROM Post p WHERE p.category = :category", Post.class )
.setParameter( "category", category )
.getResultList();
从性能的角度来看,如果我被提供一个已经获取的实体实例,我通常更喜欢使用基于对象的语法,无论它是否已经分离。如果我只有标识符,我使用标识符语法。
使用上面显示的第三种语法确实没有任何好处,除非您在输入值仅是标识符时使用基于对象的语法;但请注意,如果传入的categoryId
实际上并不代表有效实体,则会发生ObjectNotFoundException
而不是简单地接收空结果集,因为传入的categoryId
没有匹配。