2.4.9. フィルター

Hibernate では、データに対して任意のフィルターを適用できます。これらのフィルターは実行時に該当するセッションで適用されます。最初にフィルターを定義する必要があります。
@org.hibernate.annotations.FilterDef または @FilterDefs は、同じ名前を使用してフィルターで使用されたフィルター定義を定義します。フィルター定義は name() と parameters() のアレイを持ちます。パラメータにより、実行時にフィルターの動作を調整できます。各パラメータは名前とタイプを持つ @ParamDef により定義されます。また、該当する@FilterDef に対して defaultCondition() パラメータを定義して、個別の @Filter で何も定義されないときに使用するデフォルトの条件を設定することもできます。@FilterDef はクラスまたはパッケージレベルで定義できます。
この時点で、エンティティロードまたはコレクションロードのいずれかに適用される SQL フィルター句を定義する必要があります。エンティティまたはコレクションエレメントのいずれかに対して @Filter が使用および配置されます。
@Entity @FilterDef(name="minLength", parameters=@ParamDef( name="minLength", type="integer"
      ) ) @Filters( { @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
      @Filter(name="minLength", condition=":minLength <= length") } ) public class Forest {
      ... }
コレクションが関係テーブルを関係の表現として使用する場合は、関係テーブル自体またはターゲットエンティティテーブルに対してフィルター条件を適用することもできます。ターゲットエンティティに制約を適用するには、通常の @Filter アノテーションを使用します。ただし、関係テーブルを対象にする場合は、@FilterJoinTable アノテーションを使用します。
    @OneToMany
    @JoinTable
    //filter on the target entity table
    @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
    //filter on the association table
    @FilterJoinTable(name="security", condition=":userlevel >= requiredLevel")
    public Set<Forest> getForests() { ... }