2

フィルタとベースのMappedSuperClassを使用して、クエリの実行中に「アクティブ」エンティティのみを表示するようにフィルタリングしようとしていますが、関連するテーブルクラスが同じフィルタを尊重していないという問題が発生しています。

これが私のモデル設定です:

@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {

    @Column(name = "Status", insertable = false)
    private String status;

    // getters and setters...
}

関連するコレクションを持つモデルもあります。

@Entity
@Table(name = "A")
public class A extends BaseModel {
    @OneToMany()
    private List<B> bs = new ArrayList<B>(0);
// other model properties
}

@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}

クエリを実行する前に、次のコマンドを実行します。

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(A.class)
Filter filter = getCurrentSession().enableFilter("baseStatus");
List<A> as = criteria.list();

この設定を使用すると、クエリを実行しているメインクラスに適切なフィルターが適用されますが、子コレクション( "bs")は結合でフィルター処理されないため、子コレクションを持つアクティブな"A"のみが残ります。 「B」の一部は非アクティブです。

理想的には、BaseModelにのみフィルターを設定したいと思います。各関連付けに個別のフィルターを適用せずに、探していることを実行する方法はありますか?

ありがとう!

4

1 に答える 1

3

何かカスタムを構築しないと、最後にこれに対する優れた解決策を見つけることができなかったので、次のように各モデルの各関連付けテーブルで @Filter に注釈を付けることになりました

@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {

    @Column(name = "Status", insertable = false)
    private String status;

    // getters and setters...
}

@Entity
@Table(name = "A")
public class A extends BaseModel {
    @OneToMany()
    @Filter(name="baseStatus", condition= "Status = 'A'")
    private List<B> bs = new ArrayList<B>(0);
// other model properties
}

@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}

理想的ではありませんが、機能し、電話するだけで済みます

Filter filter = getCurrentSession().enableFilter("baseStatus");

共通のデータ アクセス層で 1 回。

于 2012-05-30T21:58:07.950 に答える