Hibernate:在嵌套子项的嵌套子项上创建过滤器

时间:2012-11-28 16:47:24

标签: hibernate filter

HY,

我遇到了一种有点复杂的查询问题。要理解这是我想要的SQL查询:

select * from Parent parent
left join fetch parent.child child
left joint fetch child.grandchild grandchild with age < 18;

由于获取而禁止使用with子句。

所以我必须使用过滤器。但我没有找到在Grandchild上应用过滤器的方法我认为这是因为@Filter或@FilterDef不在正确的类中。

我立刻在Grandchild类中声明了Filter(@FilterDef),然后我把它放了 声明前的@Filter(name =“age”,condition =“age&lt;:age_param”) Child类中的Collection属性。 课程是这样的:

public class Parent {
    @OneToOne(fetch = FetchType.LAZY,mappedBy="parent")
    private Collection<Child> children;
}

public class Child {
       private Parent parent;

        @Filter(name="age", condition = "age < :age_param")
        @OneToMany(fetch = FetchType.LAZY,mappedBy="child")
        private Collection<GrandChild> grandchildren;
    }

@FilterDef(name="majority",
           parameters={@ParamDef(name="age",type="int")}
             )
public class GrandChild {
       private Child child;
       private int age;
    }

然后我这样做:

filter = session.enableFiler("majority");
filter.setParameter("age_param",18);

session.createQuery("select * from Parent parent
    left join fetch parent.child child
    left joint fetch child.grandchild")
.list();

但是孙子的加入并没有条件。

有没有办法获取此查询?我做错了什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

您在过滤器注释中有一个错误。过滤器名称为 mayority ,而非年龄。并且条件必须在FilterDef注释中作为默认条件:

public class Parent {
    @OneToOne(fetch = FetchType.LAZY,mappedBy="parent")
    private Collection<Child> children;
}

public class Child {
   private Parent parent;

    @Filter(name="mayority")
    @OneToMany(fetch = FetchType.LAZY,mappedBy="child")
    private Collection<GrandChild> grandchildren;
}

@FilterDef(name="mayority",
defaultCondition = "age < :age_param"
parameters={@ParamDef(name="age",type="java.lang.Integer")})
public class GrandChild {
   private Child child;
   private Integer age;
}