2

嘿,

我遇到了一个有点复杂的查询类型的问题。直截了当,这是我想要得到的 SQL 查询:

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

由于 fetch,with 子句被禁止。

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

我立即在 Grandchild 类中声明了 Filter (@FilterDef),并将 @Filter(name="age", condition = "age < :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();

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

有没有办法获得这个查询?难道我做错了什么 ?

感谢帮助

4

1 回答 1

3

您在过滤器注释中有一个错误。过滤器名称是mayority,而不是age。并且条件必须作为默认条件进入 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;
}
于 2013-03-07T09:02:53.370 回答