欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

SpringDataJPA實(shí)例查詢-創(chuàng)新互聯(lián)

三、認(rèn)識(shí)“實(shí)例查詢”

1、概念定義:

創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、市中網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為市中等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

  上面例子中,是這樣創(chuàng)建“實(shí)例”的:Example<Customer> ex = Example.of(customer, matcher);我們看到,Example對(duì)象,由customer和matcher共同創(chuàng)建,為講解方便,我們先來明確一些定義。

   A、實(shí)體對(duì)象:在持久化框架中與Table對(duì)應(yīng)的域?qū)ο螅粋€(gè)對(duì)象代表數(shù)據(jù)庫(kù)表中的一條記錄,如上例中Customer對(duì)象。在構(gòu)建查詢條件時(shí),一個(gè)實(shí)體對(duì)象代表的是查詢條件中的“數(shù)值”部分。如:要查詢姓“劉”的客戶,實(shí)體對(duì)象只能存儲(chǔ)條件值“劉”。

   B、匹配器:ExampleMatcher對(duì)象,它是匹配“實(shí)體對(duì)象”的,表示了如何使用“實(shí)體對(duì)象”中的“值”進(jìn)行查詢,它代表的是“查詢方式”,解釋了如何去查的問題。如:要查詢姓“劉”的客戶,即姓名以“劉”開頭的客戶,該對(duì)象就表示了“以某某開頭的”這個(gè)查詢方式,如上例中:withMatcher("name", GenericPropertyMatchers.startsWith())

   C、實(shí)例:即Example對(duì)象,代表的是完整的查詢條件。由實(shí)體對(duì)象(查詢條件值)和匹配器(查詢方式)共同創(chuàng)建。

   再來理解“實(shí)例查詢”,顧名思義,就是通過一個(gè)例子來查詢。要查詢的是Customer對(duì)象,查詢條件也是一個(gè)Customer對(duì)象,通過一個(gè)現(xiàn)有的客戶對(duì)象作為例子,查詢和這個(gè)例子相匹配的對(duì)象。

2、特點(diǎn)及約束:

   1、支持動(dòng)態(tài)查詢。即支持查詢條件個(gè)數(shù)不固定的情況,如:客戶列表中有多個(gè)過濾條件,用戶使用時(shí)在“地址”查詢框中輸入了值,就需要按地址進(jìn)行過濾,如果沒有輸入值,就忽略這個(gè)過濾條件。對(duì)應(yīng)的實(shí)現(xiàn)是,在構(gòu)建查詢條件Customer對(duì)象時(shí),將address屬性值置具體的條件值或置為null。

   2、不支持過濾條件分組。即不支持過濾條件用 or(或) 來連接,所有的過濾查件,都是簡(jiǎn)單一層的用 and(并且) 連接。

   3、僅支持字符串的開始/包含/結(jié)束/正則表達(dá)式匹配 和 其他屬性類型的精確匹配。查詢時(shí),對(duì)一個(gè)要進(jìn)行匹配的屬性(如:姓名 name),只能傳入一個(gè)過濾條件值,如以Customer為例,要查詢姓“劉”的客戶,“劉”這個(gè)條件值就存儲(chǔ)在表示條件對(duì)象的Customer對(duì)象的name屬性中,針對(duì)于“姓名”的過濾也只有這么一個(gè)存儲(chǔ)過濾值的位置,沒辦法同時(shí)傳入兩個(gè)過濾值。正是由于這個(gè)限制,有些查詢是沒辦法支持的,例如要查詢某個(gè)時(shí)間段內(nèi)添加的客戶,對(duì)應(yīng)的屬性是 addTime,需要傳入“開始時(shí)間”和“結(jié)束時(shí)間”兩個(gè)條件值,而這種查詢方式?jīng)]有存兩個(gè)值的位置,所以就沒辦法完成這樣的查詢。

四、重點(diǎn)理解ExampleMatcher

1、需要考慮的因素

  查詢條件的表示,有兩部分,一是條件值,二是查詢方式。條件值用實(shí)體對(duì)象(如Customer對(duì)象)來存儲(chǔ),相對(duì)簡(jiǎn)單,當(dāng)頁面?zhèn)魅脒^濾條件值時(shí),存入相對(duì)應(yīng)的屬性中,沒入傳入時(shí),屬性保持默認(rèn)值。查詢方式是用匹配器ExampleMatcher來表示,情況相對(duì)復(fù)雜些,需要考慮的因素有:

(1)Null值的處理。當(dāng)某個(gè)條件值為Null,是應(yīng)當(dāng)忽略這個(gè)過濾條件呢,還是應(yīng)當(dāng)去匹配數(shù)據(jù)庫(kù)表中該字段值是Null的記錄?

(2)基本類型的處理。如客戶Customer對(duì)象中的年齡age是int型的,當(dāng)頁面不傳入條件值時(shí),它默認(rèn)是0,是有值的,那是否參與查詢呢?

(3)忽略某些屬性值。一個(gè)實(shí)體對(duì)象,有許多個(gè)屬性,是否每個(gè)屬性都參與過濾?是否可以忽略某些屬性?

(4)不同的過濾方式。同樣是作為String值,可能“姓名”希望精確匹配,“地址”希望模糊匹配,如何做到?

(5)大小寫匹配。字符串匹配時(shí),有時(shí)可能希望忽略大小寫,有時(shí)則不忽略,如何做到?

2、五個(gè)配置項(xiàng)

  圍繞上面一系列情況,ExampleMatcher中定義了5項(xiàng)配置來解決這些問題。

Spring Data JPA 實(shí)例查詢

public class ExampleMatcher {
NullHandler nullHandler; //Null值處理方式StringMatcher defaultStringMatcher; //默認(rèn)字符串匹配方式boolean defaultIgnoreCase; //默認(rèn)大小寫忽略方式PropertySpecifiers propertySpecifiers; //各屬性特定查詢方式Set<String> ignoredPaths; //忽略屬性列表......
}

Spring Data JPA 實(shí)例查詢

   (1)nullHandler:Null值處理方式,枚舉類型,有2個(gè)可選值,INCLUDE(包括),IGNORE(忽略)。標(biāo)識(shí)作為條件的實(shí)體對(duì)象中,一個(gè)屬性值(條件值)為Null是,是否參與過濾。當(dāng)該選項(xiàng)值是INCLUDE時(shí),表示仍參與過濾,會(huì)匹配數(shù)據(jù)庫(kù)表中該字段值是Null的記錄;若為IGNORE值,表示不參與過濾。

  (2)defaultStringMatcher:默認(rèn)字符串匹配方式,枚舉類型,有6個(gè)可選值,DEFAULT(默認(rèn),效果同EXACT),EXACT(相等),STARTING(開始匹配),ENDING(結(jié)束匹配),CONTAINING(包含,模糊匹配),REGEX(正則表達(dá)式)。該配置對(duì)所有字符串屬性過濾有效,除非該屬性在 propertySpecifiers 中單獨(dú)定義自己的匹配方式。

  (3)defaultIgnoreCase:默認(rèn)大小寫忽略方式,布爾型,當(dāng)值為false時(shí),即不忽略,大小不相等。該配置對(duì)所有字符串屬性過濾有效,除非該屬性在 propertySpecifiers 中單獨(dú)定義自己的忽略大小寫方式。

  (4)propertySpecifiers:各屬性特定查詢方式,描述了各個(gè)屬性單獨(dú)定義的查詢方式,每個(gè)查詢方式中包含4個(gè)元素:屬性名、字符串匹配方式、大小寫忽略方式、屬性轉(zhuǎn)換器。如果屬性未單獨(dú)定義查詢方式,或單獨(dú)查詢方式中,某個(gè)元素未定義(如:字符串匹配方式),則采用 ExampleMatcher 中定義的默認(rèn)值,即上面介紹的 defaultStringMatcher 和 defaultIgnoreCase 的值。

  (5)ignoredPaths:忽略屬性列表,忽略的屬性不參與查詢過濾。

 Spring Data JPA 實(shí)例查詢

3、操作方法

在ExampleMatcher中定義了一系列方式,用于設(shè)置這5項(xiàng)設(shè)置值,所有的設(shè)置方法均返回 ExampleMatcher 對(duì)象,所以支持鏈?zhǔn)骄幊膛渲谩?/p>

(1)創(chuàng)建一個(gè)默認(rèn)的 ExampleMatcher 對(duì)象。

定義:

public static ExampleMatcher matching()

默認(rèn)配置如下:
A、nullHandler:IGNORE。Null值處理方式:忽略
B、defaultStringMatcher:DEFAULT。默認(rèn)字符串匹配方式:默認(rèn)(相等
C、defaultIgnoreCase:false。默認(rèn)大小寫忽略方式:不忽略
D、propertySpecifiers:空。各屬性特定查詢方式,
E、ignoredPaths:空列表。忽略屬性列表,空列表

(2)改變Null值處理方式。

定義:
public ExampleMatcher withNullHandler(NullHandler nullHandler)
public ExampleMatcher withIncludeNullValues()
public ExampleMatcher withIgnoreNullValues()

產(chǎn)生效果:
改變配置項(xiàng)nullHandler,分別設(shè)為:指定值、INCLUDE(包括)、IGNORE(忽略)。

(3)改變默認(rèn)字符串匹配方式。
定義:
public ExampleMatcher withStringMatcher(StringMatcher defaultStringMatcher)

產(chǎn)生效果:
改變配置項(xiàng)defaultStringMatcher,設(shè)為指定值。

(4)改變默認(rèn)大小寫忽略方式。
定義:
public ExampleMatcher withIgnoreCase()
public ExampleMatcher withIgnoreCase(boolean defaultIgnoreCase)

產(chǎn)生效果:
改變配置項(xiàng)defaultIgnoreCase,分別設(shè)為:true,指定值。

(5)向“忽略屬性列表”中添加屬性。
定義:
public ExampleMatcher withIgnorePaths(String... ignoredPaths)

產(chǎn)生效果:
改變配置項(xiàng)ignoredPaths,向列表中添加一個(gè)或多個(gè)屬性。

(6)配置屬性特定查詢方式

  一個(gè)屬性的特定查詢方式,包含了3個(gè)信息:字符串匹配方式、大小寫忽略方式、屬性轉(zhuǎn)換器,存儲(chǔ)在 propertySpecifiers 中,操作時(shí)用 GenericPropertyMatcher 類來傳遞配置信息。有4個(gè)方法來改變配置,這4個(gè)方法操作時(shí),內(nèi)部均采用增量改變的方式,即如果沒有為屬性定義“特定查詢方式”,則會(huì)定義一個(gè),并根據(jù)傳進(jìn)來的“非空信息”進(jìn)行配置,如果已經(jīng)定義有,則會(huì)根據(jù)傳進(jìn)來的“非空信息”進(jìn)行更新。如果一個(gè)“特定查詢方式”中的“字符串匹配方式、大小寫忽略方式”沒有設(shè)置值,查詢時(shí)則采用ExampleMatcher中的默認(rèn)配置。

A、自定義類的方式。

定義:
public ExampleMatcher withMatcher(String propertyPath, MatcherConfigurer<GenericPropertyMatcher> matcherConfigurer)

產(chǎn)生效果:

向 propertySpecifiers 中增加或更新屬性“特定查詢方式”的配置。

參數(shù)說明:
propertyPath:要配置特定查詢的屬性名。
matcherConfigurer:自定義類對(duì)象。自定義類需要實(shí)現(xiàn)MatcherConfigurer接口,在接口的 configureMatcher() 實(shí)現(xiàn)方法中指定相關(guān)配置。

B、直接傳入通用屬性查詢對(duì)象方式。

定義:
public ExampleMatcher withMatcher(String propertyPath, GenericPropertyMatcher genericPropertyMatcher)

產(chǎn)生效果:

向 propertySpecifiers 中增加或更新屬性“特定查詢方式”的配置。

參數(shù)說明:
propertyPath:要配置特定查詢的屬性名。
genericPropertyMatcher:直接傳入一個(gè)通用查詢對(duì)象。 ExampleMatcher.GenericPropertyMatchers工具類中提供了常用對(duì)象創(chuàng)建的靜態(tài)方法,所有方法均返回 GenericPropertyMatcher 對(duì)象,所以支持鏈?zhǔn)骄幊膛渲谩?/p>

Spring Data JPA 實(shí)例查詢

另外:GenericPropertyMatcher 類本身也提供了諸多方法,用于改變相關(guān)配置項(xiàng)。

C、改變的大小寫忽略方式

定義:
public ExampleMatcher withIgnoreCase(String... propertyPaths)

產(chǎn)生效果:
向 propertySpecifiers 中增加或更新屬性“特定查詢方式”中的“大小寫忽略方式”配置。。

D、設(shè)置屬性轉(zhuǎn)換器

定義:
public ExampleMatcher withTransformer(String propertyPath, PropertyValueTransformer propertyValueTransformer)

產(chǎn)生效果:
向 propertySpecifiers 中增加或更新屬性“特定查詢方式”中的“屬性轉(zhuǎn)換器”配置。

五、常用情況說明

1、關(guān)于基本數(shù)據(jù)類型。
實(shí)體對(duì)象中,避免使用基本數(shù)據(jù)類型,采用包裝器類型。如果已經(jīng)采用了基本類型,
而這個(gè)屬性查詢時(shí)不需要進(jìn)行過濾,則把它添加到忽略列表(ignoredPaths)中。

2、Null值處理方式。
默認(rèn)值是 IGNORE(忽略),即當(dāng)條件值為null時(shí),則忽略此過濾條件,一般業(yè)務(wù)也是采用這種方式就可滿足。當(dāng)需要查詢數(shù)據(jù)庫(kù)表中屬性為null的記錄時(shí),可將值設(shè)為INCLUDE,這時(shí),對(duì)于不需要參與查詢的屬性,都必須添加到忽略列表(ignoredPaths)中,否則會(huì)出現(xiàn)查不到數(shù)據(jù)的情況。

3、默認(rèn)配置、特殊配置。
默認(rèn)創(chuàng)建匹配器時(shí),字符串采用的是精確匹配、不忽略大小寫,可以通過操作方法改變這種默認(rèn)匹配,以滿足大多數(shù)查詢條件的需要,如將“字符串匹配方式”改為CONTAINING(包含,模糊匹配),這是比較常用的情況。對(duì)于個(gè)別屬性需要特定的查詢方式,可以通過配置“屬性特定查詢方式”來滿足要求。

4、非字符串屬性
如約束中所談,非字符串屬性均采用精確匹配,即等于。

5、忽略大小寫的問題。
忽略大小的生效與否,是依賴于數(shù)據(jù)庫(kù)的。例如 MySql 數(shù)據(jù)庫(kù)中,默認(rèn)創(chuàng)建表結(jié)構(gòu)時(shí),字段是已經(jīng)忽略大小寫的,所以這個(gè)配置與否,都是忽略的。如果業(yè)務(wù)需要嚴(yán)格區(qū)分大小寫,可以改變數(shù)據(jù)庫(kù)表結(jié)構(gòu)屬性來實(shí)現(xiàn),具體可百度。

六、常用查詢示例

以“快速入門”中的實(shí)體對(duì)象和模擬數(shù)據(jù)為例,列一些常用查詢,方便開發(fā)時(shí)參考。

1、無匹配器的情況
要求:查詢地址是“河南省鄭州市”,且重點(diǎn)關(guān)注的客戶。
說明:對(duì)于默認(rèn)匹配器滿足條件時(shí),則不需要?jiǎng)?chuàng)建匹配器。

Spring Data JPA 實(shí)例查詢

     //創(chuàng)建查詢條件數(shù)據(jù)對(duì)象
        Customer customer = new Customer();
        customer.setAddress("河南省鄭州市");
        customer.setFocus(true);        
        //創(chuàng)建實(shí)例
        Example<Customer> ex = Example.of(customer); 
        
        //查詢
        List<Customer> ls = dao.findAll(ex);        
        //輸出結(jié)果
        System.out.println("數(shù)量:"+ls.size());        for (Customer bo:ls)
        {
            System.out.println(bo.getName());
        }

Spring Data JPA 實(shí)例查詢

輸出結(jié)果:

數(shù)量:4
李明
劉芳
zhang ming
ZHANG SAN

2、通用情況
要求:根據(jù)姓名、地址、備注進(jìn)行模糊查詢,忽略大小寫,地址要求開始匹配。
說明:這是通用情況,主要演示改變默認(rèn)字符串匹配方式、改變默認(rèn)大小寫忽略方式、屬性特定查詢方式配置、忽略屬性列表配置。

Spring Data JPA 實(shí)例查詢

     //創(chuàng)建查詢條件數(shù)據(jù)對(duì)象
        Customer customer = new Customer();
        customer.setName("zhang");
        customer.setAddress("河南省");
        customer.setRemark("BB");        //創(chuàng)建匹配器,即如何使用查詢條件
        ExampleMatcher matcher = ExampleMatcher.matching() //構(gòu)建對(duì)象
                .withStringMatcher(StringMatcher.CONTAINING) //改變默認(rèn)字符串匹配方式:模糊查詢
                .withIgnoreCase(true) //改變默認(rèn)大小寫忽略方式:忽略大小寫
                .withMatcher("address", GenericPropertyMatchers.startsWith()) //地址采用“開始匹配”的方式查詢
                .withIgnorePaths("focus");  //忽略屬性:是否關(guān)注。因?yàn)槭腔绢愋停枰雎缘?nbsp;       
        //創(chuàng)建實(shí)例
        Example<Customer> ex = Example.of(customer, matcher); 
        
        //查詢
        List<Customer> ls = dao.findAll(ex);        
        //輸出結(jié)果
        System.out.println("數(shù)量:"+ls.size());        for (Customer bo:ls)
        {
            System.out.println(bo.getName());
        }

Spring Data JPA 實(shí)例查詢

輸出結(jié)果:

數(shù)量:2
zhang ming
ZHANG SAN

3、多級(jí)查詢
要求:查詢所有潛在客戶
說明:主要演示多層級(jí)屬性查詢

Spring Data JPA 實(shí)例查詢

     //創(chuàng)建查詢條件數(shù)據(jù)對(duì)象
        CustomerType type = new CustomerType();
        type.setCode("01"); //編號(hào)01代表潛在客戶
        Customer customer = new Customer();
        customer.setCustomerType(type);        

        //創(chuàng)建匹配器,即如何使用查詢條件
        ExampleMatcher matcher = ExampleMatcher.matching() //構(gòu)建對(duì)象
                .withIgnorePaths("focus");  //忽略屬性:是否關(guān)注。因?yàn)槭腔绢愋停枰雎缘?nbsp;               
        
        //創(chuàng)建實(shí)例
        Example<Customer> ex = Example.of(customer, matcher); 
        
        //查詢
        List<Customer> ls = dao.findAll(ex);        
        //輸出結(jié)果
        System.out.println("數(shù)量:"+ls.size());        for (Customer bo:ls)
        {
            System.out.println(bo.getName());
        }

Spring Data JPA 實(shí)例查詢

輸出結(jié)果:

數(shù)量:4
李明
李莉
張強(qiáng)
ZHANG SAN

4、查詢Null值
要求:地址是null的客戶
說明:主要演示改變“Null值處理方式”

Spring Data JPA 實(shí)例查詢

     //創(chuàng)建查詢條件數(shù)據(jù)對(duì)象
        Customer customer = new Customer();        //創(chuàng)建匹配器,即如何使用查詢條件
        ExampleMatcher matcher = ExampleMatcher.matching() //構(gòu)建對(duì)象
                .withIncludeNullValues() //改變“Null值處理方式”:包括
                .withIgnorePaths("id","name","sex","age","focus","addTime","remark","customerType");  //忽略其他屬性        
        //創(chuàng)建實(shí)例
        Example<Customer> ex = Example.of(customer, matcher); 
        
        //查詢
        List<Customer> ls = dao.findAll(ex);        
        //輸出結(jié)果
        System.out.println("數(shù)量:"+ls.size());        for (Customer bo:ls)
        {
            System.out.println(bo.getName());
        }

Spring Data JPA 實(shí)例查詢

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:SpringDataJPA實(shí)例查詢-創(chuàng)新互聯(lián)
鏈接URL:http://www.chinadenli.net/article22/ccsojc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)品牌網(wǎng)站制作網(wǎng)站設(shè)計(jì)服務(wù)器托管響應(yīng)式網(wǎng)站外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)