1

私は一対多の関係にある2つのクラスを持っています:

   Class Competition{
        @OneToMany(fetch=FetchType.EAGER, mappedBy="competition")   
        public Set<Event> getEvents() {
            return events;
        }
    }
    Class Event{
        @ManyToOne
        @JoinColumn(name="id_competition")
        public Competition getCompetition() {
            return competition;
        }
    }

以下のクエリを実行すると、必要以上のデータを受け取ります。データベースには、競争エントリがあり、それを c1 と呼び、3 つのイベント: e1、e2、e3 とします。イベントの 1 つが条件を満たしていません (e1 の stardate < '2013-09-13') が、クエリを実行すると、2 つではなく 3 つのイベントが取得されます。データベース内のデータについて確信があるので、where句の問題?

"select com from Competition as com inner join com.events event where event.expectedStartdate > '2013-09-13' "

また、条件を満たす 2 つのイベントを削除し、条件を満たさないイベントを保持する場合、クエリは何も返さない (オブジェクト コンペティションなし) ことを指定する必要があります。

私もwith句を試しましたが、同じ結果が得られました。

4

1 に答える 1

2

エンティティを照会すると、常に完全に実現されたオブジェクト マッピングが返されます。そのようなクエリに条件を付けることによって、一連のイベントに入るものを除外することはできません。クエリで a が見つかった場合、Competition競合全体が取得されます。セットにアクセスすると、コンペティションには常にすべての子が含まれます。

ORM クエリを平易な言葉に変換する別の言い方をすると、次のようになります。

「13 日以降に開始されるイベントが少なくとも 1 つある大会をすべて見つけてください」

いいえ

「すべての大会を検索して、13 日以降に開始されるイベントのみを含めます。」

于 2013-09-13T21:15:44.367 に答える