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();
但是孙子的加入并没有条件。
有没有办法获取此查询?我做错了什么?
感谢您的帮助
答案 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;
}