更新時(shí)間:2022-11-21 08:28:53 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1164次
使用注釋過(guò)濾器是通過(guò)@org.hibernate.annotations.FilterDef或定義的@org.hibernate.annotations.FilterDefs。過(guò)濾器定義有一個(gè)name()和一個(gè)參數(shù)數(shù)組()。參數(shù)將允許您在運(yùn)行時(shí)調(diào)整過(guò)濾器的行為。@ParamDef每個(gè)參數(shù)都由一個(gè)具有名稱(chēng)和類(lèi)型的參數(shù)定義。您還可以為defaultCondition()給定定義一個(gè)參數(shù),@FilterDef以設(shè)置在每個(gè)個(gè)體都沒(méi)有定義時(shí)要使用的默認(rèn)條件@Filter。@FilterDef(s) 可以在類(lèi)或包級(jí)別定義。
我們現(xiàn)在需要定義應(yīng)用于實(shí)體加載或集合加載的 SQL 過(guò)濾器子句。@Filter被使用并放置在實(shí)體或集合元素上。@FilterName和之間的連接@Filter是一個(gè)匹配的名字。
@Entity @FilterDef ( name = "minLength" , parameters = @ParamDef
( name = "minLength" , type = "integer" ) ) @Filters ( { @Filter ( name = " betweenLength " , condition = " : minLength <= length和 :maxLength >= length" ), @Filter ( name = " minLength " , condition =
":minLength <= length" )
} ) public class Forest { ... }
當(dāng)集合使用關(guān)聯(lián)表作為關(guān)系表示時(shí),您可能希望將過(guò)濾條件應(yīng)用于關(guān)聯(lián)表本身或目標(biāo)實(shí)體表。要在目標(biāo)實(shí)體上應(yīng)用約束,請(qǐng)使用常規(guī)@Filter注釋。但是,如果要以關(guān)聯(lián)表為目標(biāo),請(qǐng)使用@FilterJoinTable注解。
@OneToMany @JoinTable
//在目標(biāo)實(shí)體表上過(guò)濾@Filter
( name = "betweenLength" , condition = " :minLength <= length and :maxLength >= length" ) //在關(guān)聯(lián)表上 過(guò)濾 @FilterJoinTable ( name = " security” , condition = “:userlevel >= requredLevel” ) public Set < Forest > getForests () { ... }
使用 Hibernate 映射文件來(lái)定義過(guò)濾器,情況非常相似。必須首先定義過(guò)濾器,然后將其附加到適當(dāng)?shù)挠成湓亍Rx過(guò)濾器,請(qǐng)?jiān)?span style="font-family:monospace"><filter-def>元素中使用<hibernate-mapping/>元素:
< filter-def name = "myFilter" >
<過(guò)濾器參數(shù)名稱(chēng)= “myFilterParam”類(lèi)型= “字符串” />
</過(guò)濾器定義>
然后可以將此過(guò)濾器附加到一個(gè)類(lèi)或集合(或者同時(shí)附加到兩個(gè)或多個(gè)):
<班級(jí)名稱(chēng)= "我的班級(jí)" ... >
... <過(guò)濾器名稱(chēng)= "myFilter"條件= ":myFilterParam = MY_FILTERED_COLUMN" />
<設(shè)置 ... >
<過(guò)濾器名稱(chēng)= "myFilter"條件= ":myFilterParam = MY_FILTERED_COLUMN" />
</集> </類(lèi)>
Session對(duì)象中會(huì)用到的方法有:enableFilter(String filterName),getEnabledFilter(String filterName),和disableFilter(String filterName)。Session中默認(rèn)是不啟動(dòng)過(guò)濾器的,必須通過(guò)Session.enabledFilter()方法顯式的啟動(dòng)。該方法返回被啟動(dòng)Filter的為實(shí)例:上面的例子。
會(huì)議。啟用過(guò)濾器(“我的過(guò)濾器” )。setParameter ( "myFilterParam" , "some-value" );
注意,org.hibernate.Filter 的方法允許鏈接方式調(diào)用。(類(lèi)似上面例子中啟用 Filter 之后設(shè)置 Filter 參這個(gè)“方法鏈接”) Hibernate 的其他很多部分。
下面是一個(gè)比較完整的例子,使用了記錄生命有效日期模式過(guò)濾有效的數(shù)據(jù):
< filter-def name = "effectiveDate" >
<過(guò)濾器參數(shù)名稱(chēng)= “asOfDate”類(lèi)型= “日期” />
</過(guò)濾器定義>
<類(lèi)名= “員工” ... >
... <多對(duì)一name = "department" column = "dept_id" class = "Department" />
<屬性名= "effectiveStartDate" type = "date" column = "eff_start_dt" />
<屬性名稱(chēng)= “effectiveEndDate”類(lèi)型= “日期”列= “eff_end_dt” />
... <!--
請(qǐng)注意,這假設(shè)非終端記錄的 eff_end_dt 設(shè)置為
為簡(jiǎn)單起見(jiàn),最大數(shù)據(jù)庫(kù)日期
-->
<過(guò)濾器名稱(chēng)= “有效日期”
condition = ":asOfDate BETWEEN eff_start_dt and eff_end_dt" />
</類(lèi)>
<班級(jí)名稱(chēng)= “部門(mén)” ... >
... < set name = "employees" lazy = "true" >
<關(guān)鍵列= “dept_id” />
<一對(duì)多類(lèi)= “員工” />
<過(guò)濾器名稱(chēng)= “有效日期”
condition = ":asOfDate BETWEEN eff_start_dt and eff_end_dt" />
</套>
</類(lèi)>
定義好后,如果想保取回的都是目前為止生成期的記錄,只需要在獲取雇員數(shù)據(jù)的操作之前先啟動(dòng)過(guò)濾器即可:
會(huì)話 會(huì)話 = ...; 會(huì)議。啟用過(guò)濾器(“有效日期” )。setParameter ( "asOfDate" , new Date ()); 列出 結(jié)果 = 會(huì)話。createQuery ( "from Employee as e where e.salary > :targetSalary" ) 。setLong (“targetSalary” ,新長(zhǎng)(1000000 ))。列表();
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743