Hibernateデータフィルタの例 - XMLとアノテーション

Hibernateデータフィルターの例– XMLおよび注釈

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

Hibernateデータフィルターの例

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

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

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


     
XMLマッピングの例

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


 
   ...
   
      
         
      
      
    
   
 

 
   
 

condition=”date >= :stockRecordFilterParam”では、「日付」は「StockDailyRecord」に属するプロパティです。

2. アノテーションのHibernateデータフィルター

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

@FilterDef(name="stockRecordFilter",
parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )
注釈の例

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

...
@Entity
@FilterDef(name="stockRecordFilter",
parameters=@ParamDef( name="stockRecordFilterParam", type="date" ) )
@Table(name = "stock", catalog = "example")
public class Stock implements java.io.Serializable {
         ...
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
    @Filter(
        name = "stockRecordFilter",
        condition="date >= :stockRecordFilterParam"
    )
    public Set getStockDailyRecords() {
        return this.stockDailyRecords;
    }

condition=”date >= :stockRecordFilterParam”では、「日付」は「StockDailyRecord」に属するプロパティです。

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

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

Filter filter = session.enableFilter("stockRecordFilter");
filter.setParameter("stockRecordFilterParam", new Date());

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

session.disableFilter("stockRecordFilter");

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

データフィルタを適用および実装する方法を示すコードスニペットを次に示します。

        Session session = HibernateUtil.getSessionFactory().openSession();

        System.out.println("****** Enabled Filter ******");

        Filter filter = session.enableFilter("stockRecordFilter");
        filter.setParameter("stockRecordFilterParam", new Date());

        Stock stock = (Stock)session.get(Stock.class, 2);
        Set sets = stock.getStockDailyRecords();

        for(StockDailyRecord sdr : sets){
        System.out.println(sdr.getDailyRecordId());
        System.out.println(sdr.getDate());
    }

        System.out.println("****** Disabled Filter ******");

        session.disableFilter("stockRecordFilter");
        //clear the loaded instance and get Stock again, for demo only
        session.evict(stock);

        Stock stock2 = (Stock)session.get(Stock.class, 2);
        Set 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」コレクションがパラメーターの日付でフィルターされます。

P.S filter.setParameter(“stockRecordFilterParam”, new Date());, the current new Date is 2010-01-27.