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 SetgetStockDailyRecords() { 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); Setsets = 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.