在Hibernate中何时使用where子句中的ID或对象?

时间:2017-02-01 01:52:10

标签: hibernate

我是Hibernate的初学者。在where子句中使用ID或Object时,我感到很困惑(合理,性能,优化)。

例: from Post p where p.category.id = :cid 要么 from Post p where p.category = :category

感谢帮助我!

1 个答案:

答案 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没有匹配。