這篇文章主要介紹了Hibernate如何查詢,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為永寧企業(yè)提供專業(yè)的網(wǎng)站制作、成都做網(wǎng)站,永寧網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
包名:hibernate-conditions.jar
主要是擴展了hibernate的查詢功能,該功能依賴于hibernate及hibernate相關(guān)包.
主要擴展了將一個變量注釋成一個查詢條件的功能,把整個對象當(dāng)成一個未知的查詢條件,交給解析器去解析.核心是幾個注釋的使用.下面解釋這幾個注釋.
1. AsCondition 把一個變量注釋成一個條件,該注釋有兩個最主要的字段,propertyName和symbol其中propertyName是指定要查詢的hibernate實體的字段. symbol指明查詢的操作比較符,即"=","< ",">"等操作.還有幾個比較次要的字段: groupOrdinal 指定分組的序號,如果一個對象有多個查詢條件,可以指定這些條件序號.可以在不要的查詢過程中指定不同的查詢序號.
ignoreNull 是否忽略null值,默認(rèn)是忽略.如果不忽略null值,則在條件解析過程中遇到該查詢條件的值為空,則將該條件解析為 "propertyName" is null
inherit 是否查詢父類,默認(rèn)是不查詢父類.
2. AsAlias 查詢集合,對應(yīng)Criteria.createAlias()方法.只是里面有一個ignoreEmpty字段不同,該字段指定是否忽略集合為空,如果不忽略集合為空,則當(dāng)該值為null的時候,解析后的查詢條件為:集合 is empty
3. DesignatedProperty 該注釋是用在被注釋的是一個類,并指定該類中的一個屬性作為查詢條件的值.
4. Conversion 用于條件值的數(shù)據(jù)類型的轉(zhuǎn)換.如:被查詢條件值為Integter而被注釋的變量為String,這時候就可以使用該注釋把數(shù)據(jù)類型從String轉(zhuǎn)換為Integter.除了通用類型的數(shù)據(jù)的轉(zhuǎn)換還可以數(shù)據(jù)的類型的轉(zhuǎn)換,把數(shù)據(jù)轉(zhuǎn)換的類型ConversionType指定為Custom,注意,如果該屬性指定為Custom則需要給出customDataConversionType的類型,該類型必須是繼承DataConversion接口.如果沒有指定,則不能進(jìn)行任何的數(shù)據(jù)轉(zhuǎn)換.
Conversion里還有一個屬性throwDataConversionException,該屬性指定如果數(shù)據(jù)轉(zhuǎn)換異常,是否拋出異常,如果拋出異常則當(dāng)次的查詢會終止.如果出現(xiàn)異常但不拋出,則會忽略該查詢條件.
使用也很簡單:
創(chuàng)建一個AnnotationConditionParser對象,調(diào)用該對象的parser(Object...unkownConditionObject)方法可以指定未知道的條件實體,該方法被了接收被注釋過的實體外還可以接收原來hibernate的查詢條件和字符串的查詢條件,如果是字符串的查詢條件必須符合Criteria的查詢格式,否則在hibernate解析時會有查詢的異常.
AnnotationConditionParser對象中的groupLimit(int groupLimit)方法用于限定查詢的分組,如果指定的分組則只解析屬于該組的條件.
具體執(zhí)行對條件的解析操作是createCriteria(DetachedCriteria criteria)方法,該方法把所有的條件解析成DetachedCriteria 的查詢條件.接下來就是對DetachedCriteria 的操作了.由于DetachedCriteria 對象是hibernate的對象,該對象的用法相信大家比我還熟悉. 我在這里就不再解釋了.
具體例子(只作為例子講解,無法直接運行):
public class ConditionTest { /** * @param args */ public static void main(String[] args) { ConditionTest test = new ConditionTest(); test.setName("my name"); test.setSize(10); OtherClass other1 = new OtherClass(); other1.setName("name1"); test.setObjectCondition(other1); OtherClass other2 = new OtherClass(); other2.setName("name1"); test.setOther(other2); DetachedCriteria detachedCriteria = DetachedCriteria.forEntityName("UserEntity"); new AnnotationConditionParser() //限定查詢的分組 .groupLimit(1) //設(shè)置查詢的實體對象 .parser(test) //執(zhí)行查詢并填充DetachedCriteria對象 .createCriteria(detachedCriteria); // ... // 執(zhí)行detachedCriteria對象的數(shù)據(jù)查詢操作 } //最簡單的用法 @AsCondition(propertyName="size") private int size; @AsCondition(propertyName="name", symbol=Symbol.LIKE) private String name; //指定對象里的一個屬性作為查詢的條件 @AsCondition(propertyName="name") @DesignatedProperty(propertyName="name") private OtherClass objectCondition; public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public OtherClass getObjectCondition() { return objectCondition; } public void setObjectCondition(OtherClass objectCondition) { this.objectCondition = objectCondition; } public OtherClass getOther() { return other; } public void setOther(OtherClass other) { this.other = other; } //使用數(shù)據(jù)類型的轉(zhuǎn)換 @AsCondition(propertyName="datetime", symbol=Symbol.NE, ignoreNull=true) @DesignatedProperty(propertyName="name") @Conversion(dataConversion=ConversionType.Custom, customDataConversionType=CustomTypeConversion.class) private OtherClass other; public static class OtherClass{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class CustomTypeConversion implements DataConversion{ @Override public Object doConversion(Object data) throws DataConversionException { return Date.valueOf(data.toString()); } } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Hibernate如何查詢”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!