2

やあ、

クエリの種類に少し複雑な問題が発生しました。正確に言うと、これは私が取得したいSQLクエリです。

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

フェッチのため、with句は禁止されています。

だから私はフィルターを使わなければなりませんでした。しかし、孫にフィルターを適用する方法が見つかりませんでした。これは、@Filterまたは@FilterDefが適切なクラスにないためだと思います。

すぐに、GrandchildクラスでFilter(@FilterDef)を宣言し、ChildクラスのCollection属性の宣言の直前に@Filter(name = "age"、condition = "age <:age_param)を配置します。クラスは次のようなものです:

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

Filter アノテーションにバグがあります。フィルター名はageではなく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;
}
于 2013-03-07T09:02:53.370 に答える