Hibernateデータフィルタは、データベースからのリトリーブデータをより再利用可能な方法と「可視性」のルールでフィルタリングする革新的な方法です。データフィルタには、一意の名前、グローバルアクセス、およびフィルタルールのパラメータ値の受け入れがあり、Hibernateセッションでそれを有効または無効にすることができます。

休止状態のデータフィルタの例

この例では、データフィルタを定義し、指定された日付でコレクションデータをフィルタリングします。 Hibernateデータフィルタは、XMLマッピングファイルとアノテーションの両方で実装できます。

1. XMLマッピングファイル内のHibernateデータフィルタ



filter-def

‘キーワードを使用してデータフィルタを定義し、日付パラメータを受け入れます。

<filter-def name="stockRecordFilter">
     <filter-param name="stockRecordFilterParam" type="date"/>
</filter-def>

XMLマッピングの例

それを宣言してコレクションセットに割り当てるXMLマッピングファイルの例。

<hibernate-mapping>
 <class name="com.mkyong.common.Stock" table="stock" catalog="mkyong">
   ...
   <set name="stockDailyRecords" inverse="true" table="stock__daily__record">
      <key>
         <column name="STOCK__ID" not-null="true"/>
      </key>
      <one-to-many class="com.mkyong.common.StockDailyRecord"/>
    <filter name="stockRecordFilter" condition="date >= :stockRecordFilterParam"/>
   </set>
 </class>

 <filter-def name="stockRecordFilter">
   <filter-param name="stockRecordFilterParam" type="date"/>
 </filter-def>
</hibernate-mapping>

In

condition = “date> =:stockRecordFilterParam”

の場合、 ‘date’は ‘StockDailyRecord’に属するプロパティです。

2.アノテーション内のデータフィルタを休止状態にする



@ FilterDef

‘キーワードでデータフィルタを定義し、

@ ParamDef

で日付パラメータを受け入れます。

@FilterDef(name="stockRecordFilter",
parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )

注釈の例

それを宣言してコレクションセットに割り当てる注釈ファイルの例。

...

@Entity @FilterDef(name = "stockRecordFilter"、parameters = @ ParamDef(name = "stockRecordFilterParam"、type = "date"))@Table(name = "stock"カタログ= "mkyong")publicクラスStockはjavaを実装しています。 io.Serializable {...

@OneToMany(fetch = FetchType.LAZY、mappedBy = "stock")
    @フィルタ(
        name = "stockRecordFilter"、
        条件= "日付> =:stockRecordFilterParam"
    )
    public Set <StockDailyRecord> getStockDailyRecords(){
        これを返す.stockDailyRecords;
    }

In

condition = “date> =:stockRecordFilterParam”

の場合、 ‘date’はaです。
プロパティは ‘StockDailyRecord’に属します。

===データフィルタを有効または無効にする方法

データフィルタを有効にします。

フィルタフィルタ= session.enableFilter( "stockRecordFilter");
filter.setParameter( "stockRecordFilterParam"、new Date());

データフィルタを無効にします。

session.disableFilter( "stockRecordFilter");

===日付フィルターの適用と実装

データの適用と実装の方法を示すコードスニペット
フィルタ。

セッションセッション= HibernateUtil.getSessionFactory()。openSession();
        
        System.out.println( "** ** ** ** ** **  Enabled Filter ** ** ** ** ** ** ");
        
        フィルタフィルタ= session.enableFilter( "stockRecordFilter");
        filter.setParameter( "stockRecordFilterParam"、new Date());
        
        株価=(株)セッション.get(Stock.class、2);
        <StockDailyRecord>を設定する= stock.Stock.getStockDailyRecords();
        
        for(StockDailyRecord sdr:sets){
        System.out.println(sdr.getDailyRecordId());
        System.out.println(sdr.getDate());
    }
        
        System.out.println( "** ** ** ** ** **  Disabled Filter ** ** ** ** ** ** ");
        
        session.disableFilter( "stockRecordFilter");
       //ロードされたインスタンスをクリアし、デモだけのためにストックを再度取得する
        session.evict(株);
        
        ストックストック2 =(ストック)session.get(Stock.class、2);
        Set <StockDailyRecord> sets2 = stock2.getStockDailyRecords();を設定します。
        
        for(StockDailyRecord sdr:sets2){
        System.out.println(sdr.getDailyRecordId());
        System.out.println(sdr.getDate());
    }


出力

** ** ** ** ** **  Enabled Filter ** ** ** ** ** **
58
2010-01-31
** ** ** ** ** **  Disabled Filter ** ** ** ** ** **

60
2010-01-02
58
2010-01-31
63
2010-01-23
61
2010-01-03
...

この例では(XMLとアノテーションの両方)、フィルタが有効にされた後、そのすべての ‘StockDailyRecord’コレクションがパラメータdateでフィルタリングされます。


P.S filter.setParameter( “stockRecordFilterParam”、new Date());現在の新しい日付は2010-01-27です.