我可以使用Hibernate过滤注释来按子集合内容过滤实体吗?

时间:2015-01-14 11:10:24

标签: java hibernate

我将实体ParentEntity定义为

public class ParentEntity
{
   private long id;
   private List<ChildEntity> children;

   @OneToMany(mappedBy = "parent")
   public List<ChildEntity> getChildren()
   {
       return children;
   }
}

public class ChildEntity
{
   private ParentEntity parent;
   private String code; 
   ...
}

我明白使用注释@FilterJoinTable我可以过滤父母有一个具有特定代码的孩子,定义为过滤器参数,但是 我试图想象如何通过注释过滤没有孩子的父母或代码作为参数定义的孩子。

像SQL一样:

select * from ParentEntity p left join ChildEntity c 
                on p.id=c.parent_id
where p.id in (select p.id from ParentEntity p join ChildEntity c 
                on p.id=c.parent_id where c.code=:code) 
OR p.id  not in ( select parent_id from ChildEntity )

或HQL:

select p from ParentEntity p join fetch p.childen c 
where p.id in (select p.id from ParentEntity p join p.childen c where c.code=:code) 
OR p.id  not in ( select c.parent.id from ChildEntity c )

这是因为我有很多以ParentList<Parent>作为属性的课程,而且每个课程都会审核ChildEntity,总是上面的条件相同,所以我不会在所有查询中重写相同的条件。

你有什么想法吗?

由于

2 个答案:

答案 0 :(得分:0)

Filter子句直接指向SQL where子句。

我认为你可以尝试类似的东西:

@Filter(name = "childWithCode", 
  condition = "(exists (select 1 from ChildEntity ce where id = ce.parent_id and code='foobar'))")
public class ParentEntity { ...

答案 1 :(得分:0)

最灵活的方法是简单地使用查询:

String code = ...;

Query query = session.createQuery(
    "select p" +
    "    from ParentEntity p" +
    "    left join p.children c" +
    "    where c is null or c.code = :code"
);
query.setParameter("code", code);
List list = query.list();

然后,只要您需要过滤的Parent,就可以运行此DAO方法。

这更灵活,因为有时您可能想要检索没有孩子的父母。也许商业案例要求删除孩子,只是稍后添加。如果您总是过滤掉没有孩子的父母,那么您将无法重新添加孩子,对吗?