0
    class A{
// one to many mapping
    List<B> listOfB;
    //getter and setter;
    class B {
    String s;
    //getter and setter
    }

これで、クラスAを取得すると、listOfB内の関連するすべてのクラスBが返されます。しかし、私はBのどちらが応答すべきかという特定の条件が必要です。Get Aのように、listOfBには、s='something'であるすべてのBが含まれます。

編集:現在これは機能していません:

select a from A a where a.listOfB IN (select b from a.listOfB b where b.s='something');
4

2 に答える 2

0

1) A.listOfB = Bb のように、A から B に 1 対多の関係をマッピングしたと仮定します。

クエリは次のように簡略化できると思います。

select a 
from A a, B b
where a.listOfB = b.b
and where b.s='something'

同等の Hibernate Criteria クエリは次のようになります。

List results =  sess.createCriteria(A.class)  
    .createCriteria("listOfB")
    .add(Restrictions.eq("s", "something"))
    .list();

2) これらのエンティティ間にマッピングされた関係がない場合は、フィールド a.listOfB に対して SQLRestriction を使用できます。

List results = sess.createCriteria(A.class)
.add( Restrictions.sqlRestriction("{alias}.listOfB in (selec b from B where b.s = ?)), "something", Hibernate.STRING) )
   .list();

その他の例はこちら.

于 2012-09-14T12:02:21.740 に答える
0

JPA仕様では禁止されているはずですが、Hibernateでそれを行うことができます。実際、 を取得した場合A、その B のリストは常に B の完全なリストでなければなりません。何らかのクエリでフィルタリングされたリストではありません。危ないのでやめておきます。むしろ、次のようなクエリを使用します。

select a, b from A a inner join a.listOfB b where b.s = 'something'

これで、関心のあるすべての As と、関心のあるすべての B が得られました。

A1, B1
A1, B2
A2, B7
A2, B8

本当に B の部分的なリストで As を取得したい場合は、次のクエリを使用します。しかし、あなたは警告されました: それは移植性がなく、危険です:

select a from A a inner join fetch a.listOfB b where b.s = 'something'
于 2012-09-14T12:02:53.783 に答える