0

私は3つのテーブルを持っています:

Company
id  name
1   Fred Co.

Person
id   name
1    Fred

Employee
id company_id person_id rank
1  1          1         1
2  1          1         2

現在、ランクは別のアプリケーションで使用されていますが、私が使用しているものについては気にしません。私がやりたいのは、一意の従業員のみを返す休止状態のマッピングを(ドメインモデルを介して)作成することです。

私は現在持っています

class Person {
    @Column(name = "id")
    Long id;

    @Column(name = "name")
    String id;
}

class Company {
    @Column(name = "id")
    Long id;

    @Column(name = "name")
    String id;

    @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "EMPLOYEE", 
                joinColumns = { @JoinColumn(name = "COMPANY_ID") },
                inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") })
    @LazyCollection(LazyCollectionOption.EXTRA)
    List<Person> employees = new ArrayList<Person>();
}

しかし、これはそれを意味しfredCo.employees.size() == 2ます。一意の人だけが返されるようにフィルタリングするにはどうすればよいですか?

ドメインモデルを介してこれを実行したいと思います。

編集:上記の例は小さいですが、実際には、Personオブジェクトは非常に大きく、会社ごとに数千人の従業員がいます(したがって、非常に怠惰です)。

今、私は得ることができます(そして持っています)

companyDao.getEmployeesFor(Company...)
companyDao.getEmployeeCountFor(Company...)

でも少し気分が悪いので、ダオなしでやりたいです。

4

1 に答える 1

2

ランクが常に設定され、最初のレコードが常に「1」である場合は、単純な@ Where / @ WhereJoinTable句をマッピングに追加して、コレクションをランク1のレコードに制限できます。

https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_Application_Platform/5/html/Hibernate_Annotations_Reference_Guide/entity-hibspec-collection.html

別の方法は、コレクションをSetに変更し、「rank」フィールドを含まないPersonにequals()メソッドを実装することです。

アップデート:

さて、あなたが前に述べたように、これは機能しません。私はいくつかのテストを行いましたが、@ LazyCollectionがアソシエーションで定義されている場合、このアソシエーションの@Where制限はとにかく無視されるようです。エクストラレイジーコレクションでsize()を呼び出すと、実際にはHibernateがデータベースに対してcount()クエリを発行します。追加の句は追加されません。

@Whereを無視する必要がある理由私にはわかりませんが、これは他の場所で照会されており、未解決の問題のようです。

https://forum.hibernate.org/viewtopic.php?f=9&t=988631&view=previous

https://hibernate.onjira.com/browse/HHH-3319

以前のSQL内部クエリを使用して定義されたVIEWにマップする追加のEmployeeエンティティを作成することで、まだやりたいことができると思います。その後、フィルタリングはdbレベルで行われます。エンティティをビューにマッピングすることは、テーブルとまったく同じです。

次に、多対多を、会社と個人から従業員までの2つの1対多の関連付けに置き換えます。

于 2012-07-16T13:29:57.187 に答える