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.