日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot + QueryDSL 大大简化复杂查询操作

發布時間:2023/12/20 javascript 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot + QueryDSL 大大简化复杂查询操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

本篇博客主要將介紹的是利用spring query dsl框架實現的服務端查詢解析和實現介紹。

查詢功能是在各種應用程序里面都有應用,且非常重要的功能。用戶直接使用的查詢功能往往是在我們做好的UI界面上進行查詢,UI會將查詢請求發給查詢實現的服務器,或者專門負責實現查詢的一個組件。市場上有專門做查詢的框架,其中比較出名,應用也比較廣泛的是elasticsearch。

定義查詢請求

對于服務端來說,前端UI發送過來的查詢請求必然是按一定規則組織起來的,這樣的規則后端必須能夠支持和解析。換一種說法就是服務調用者和服務發布者之間需要遵循同一個規范才可以。百度的UI查詢是這樣定義的:

圖片

在上圖中加了藍色下劃線的地方即為我們在百度當中搜索的字符串內容,可以發現,百度的實現是將搜索的內容當做了http請求的url的參數來處理的,用了一個q作為key,q后面的內容就是所查詢的內容。

google的實現是類似的,如下圖所示:

圖片

對于google和百度這樣的只有一個搜索框的查詢界面,這樣處理是比較合理的,也不是整個查詢實現最關鍵的部分。更為關鍵的是后續服務器將這個查詢內容進行了怎樣的處理。對于別的一些產品來說,可能需要對某些關鍵字進行單獨的查詢,這個時候肯定就不是一個搜索框能個滿足的需求了。

總的來說,我們可以有如下的方式來組織一個查詢

google-like查詢

這種查詢典型的應用是一個查詢框,什么都可以查的情形,例如google和百度。對于這樣的查詢需求來說,在構建查詢請求時只需將查詢的內容放在http請求的的參數里面即可。

這樣的查詢解析是非常方便的,難度和需要考慮得事情在于要講查詢的內容放到哪些地方去查詢。從數據庫的層面來說就是要去哪些數據庫的哪些表去查詢。

特定字段的類sql查詢

這種查詢是指定某個字段,然后采用類似于sql語句的寫法進行查詢,各種查詢條件以一定的形式組織在一起,發給服務器進行解析。這樣的查詢對服務器解析查詢的能力要求更高,它提供了一些更加具體的查詢條件。

例如我們以冒號表示等于,則一個查詢字符串的形式是:

name:bill

這個查詢的意思就是查詢名字name等于bill的記錄。

我們也可以將多個條件拼接在一起,讓他們直接用邏輯關系組合在一起,例如或者和并且的邏輯關系。例如:

name:bill?AND?city:LA

或者下面這種或者的關系:

name:bill?OR?city:LA

上面的查詢語句意味著我們的前后臺要定義一套自己的查詢邏輯和架構,并且解析它,并將它轉換為正確的查詢。若我們想實現靈活的查詢,則上面的查詢語句在符合規則的前提下應當是可以自由組合的。怎么做取決于我們的實際需求。如果一個寫死的查詢關鍵字就能滿足我們的需求,則在當前那個時期自然也是合理的。

但是從靈活性角度,技術角度,實現成靈活的可解析的,顯然是我們更想要的功能。最靈活的當然就是sql語句能支持怎樣的查詢,我們都能支持對應的查詢寫法,但是這對服務器的解析邏輯就有了更加高的要求,尤其是當主表子表混在一起查詢之后,會更加復雜

我們創建了一個高質量的技術交流群,與優秀的人在一起,自己也會優秀起來,趕緊點擊加群,享受一起成長的快樂。另外,如果你最近想跳槽的話,年前我花了2周時間收集了一波大廠面經,節后準備跳槽的可以點擊這里領取!

使用Spring Data Querydsl

什么是Querydsl呢?Querydsl是一個框架,它可以通過它提供的的API幫助我們構建靜態類型的SQL-like查詢,也就是在上面我們提到的組織查詢方式。可以通過諸如Querydsl之類的流暢API構造查詢。

Querydsl是出于以類型安全的方式維護HQL查詢的需要而誕生的。 HQL查詢的增量構造需要String連接,這導致難以閱讀的代碼。通過純字符串對域類型和屬性的不安全引用是基于字符串的HQL構造的另一個問題。

隨著域模型的不斷變化,類型安全性在軟件開發中帶來了巨大的好處。域更改直接反映在查詢中,而查詢構造中的自動完成功能使查詢構造更快,更安全。

用于Hibernate的HQL是Querydsl的第一個目標語言,如今querydsl支持JPA,JDO,JDBC,Lucene,Hibernate Search,MongoDB,Collections和RDFBean作為它的后端。

其官方網站在這里:http://querydsl.com/

Querydsl和spring有什么關系呢?幾個Spring Data的模塊通過QuerydslPredicateExecutor提供了與Querydsl的集成,如以下示例所示:

public?interface?QuerydslPredicateExecutor<T>?{ //查找并返回與Predicate匹配的單個entity。Optional<T>?findById(Predicate?predicate);?? //查找并返回與Predicate匹配的所有entityIterable<T>?findAll(Predicate?predicate);??? //返回與Predicate匹配的數量。long?count(Predicate?predicate);???????????? //返回是否存在與Predicate匹配的entity。boolean?exists(Predicate?predicate);????????//?…?more?functionality?omitted. }

Predicate就是我們需要傳入的一個查詢的抽象。

在spring當中使用Querydsl,只需要在spring的repository接口繼承QuerydslPredicateExecutor,如以下示例所示:

interface?UserRepository?extends?CrudRepository<User,?Long>,?QuerydslPredicateExecutor<User>?{ }

在定義了上面的這個接口之后,我們就可以使用Querydsl Predicate編寫type-safe的查詢,如以下示例所示:

Predicate?predicate?=?user.firstname.equals("dave").and(user.lastname.startsWith("mathews"));userRepository.findAll(predicate);

上面的代碼構建出的predicate體現在sql語句里的話就是這樣的: where firstname = 'dave' and lastname ='mathews%'。這就是所謂的類sql的查詢,用起來非常的直觀。

因此,我們可以將我們接收到的查詢請求,轉化為對應的predicte,且從技術上講,只要predict支持的查詢拼接我們都能支持,難點只在于如何解析查詢請求,以及如何將他們轉換為對應的predicate.

速領:神作《鳳凰架構:構建可靠的大型分布式系統》電子版

利用Spring Query DSL實現動態查詢

下面是使用spring和Querydsl實現動態查詢的一個例子.

現在假設我們有Model類如下:

public?class?Student?{private?String?id;private?String?gender;private?String?firstName;private?String?lastName;private?Date?createdAt;private?Boolean?isGraduated;}

我們希望可以實現該類所有字段直接自由組合進行查詢,且可以按照與和或的邏輯進行查詢。且我們約定用冒號表示等于,例如:

firstname:li?AND?lastname:huafirstname:li?OR?lastname:huafirstname:li?AND?lastname:hua?AND?gender:male

上面的查詢都比較清晰,解析不會有太大難度,下面我們來看這樣一個查詢:

firstname:li?OR?lastname:hua?AND?gender:male

這個查詢的問題在于作為邏輯與的gender查詢,到底是只和前面一個條件進行與操作,還是與前面兩個條件一起進行一個與操作,顯然與的條件往往是作為filter的功能出現的。

因此我們應當將其看作整個其他條件的與操作,因此我們需要先將前面的條在組合在一起,例如,我們可以使用括號表示這個邏輯,那么查詢就會變成:

(firstname:li?AND?lastname:hua)?AND?gender:male

這下邏輯就變得清晰了,難題就在于怎么解析了

public?class?QueryAnalysis{private?static?final?String?EMPTY_STRING?=?"";private?static?final?String?BLANK_STRING?=?"?";private?static?final?String?COLON?=?":";private?static?final?String?BP_CATEGORY_CODE?=?"categoryCode";private?static?final?String?OPEN_PARENTTHESIS?=?"(";private?static?final?String?CLOSE_PARENTTHESIS?=?")";private?static?final?String?QUERY_REGEX?=?"([\\w.]+?)(:|<|>|!:)([^?]*)";//it?has?to?lie?between?two?blanksprivate?static?final?String?QUERY_LOGIC_AND?=?"?AND?";private?void?generateQueryBuilderWithQueryString(PredicateBuilder?builder,?String?q,List<String>?queryStringList)?{StringBuilder?stringBuilder?=?new?StringBuilder();String?queryTerm?=?q;if?(q?==?null)?{return;}if?(!q.contains("?AND?")?&&?!q.startsWith("(")?&&?!q.endsWith(")"))?{queryTerm?=?stringBuilder.append("(").append(q).append(")").toString();}Map<String,?Matcher>?matcherMap?=?getMatcherWithQueryStr(queryTerm);Matcher?matcherOr?=?matcherMap.get("matcherOr");Matcher?matcherAnd?=?matcherMap.get("matcherAnd");while?(matcherOr.find())?{builder.withOr(matcherOr.group(1),?matcherOr.group(2),?matcherOr.group(3));}while?(matcherAnd.find())?{builder.withAnd(matcherAnd.group(1),?matcherAnd.group(2),?matcherAnd.group(3));isSearchParameterValid?=?true;}}private?static?Map<String,?Matcher>?getMatcherWithQueryStr(String?q)?{StringBuilder?stringBuilder?=?new?StringBuilder();Pattern?pattern?=?Pattern.compile(QUERY_REGEX);//?inside?the?subString?is?"or",outside?them?are?"and"String[]?queryStringArraySplitByAnd?=?q.split(QUERY_LOGIC_AND);String?queryStringOr?=?EMPTY_STRING;String?queryStringAnd?=?EMPTY_STRING;for?(String?string?:?queryStringArraySplitByAnd)?{if?(string.trim().startsWith(OPEN_PARENTTHESIS)?&&?string.trim().endsWith(CLOSE_PARENTTHESIS))?{//only?support?one?OR?sentencequeryStringOr?=?string.trim().substring(1,string.length()-1);}?else?{queryStringAnd?=?stringBuilder.append(string).append(BLANK_STRING).toString();}}String?queryStringAndTrim?=?queryStringAnd.trim();if(queryStringAndTrim.startsWith(OPEN_PARENTTHESIS)?&&?queryStringAndTrim.endsWith(CLOSE_PARENTTHESIS)){queryStringAnd?=?queryStringAndTrim.substring(1,queryStringAndTrim.length()-1);}Matcher?matcherOr?=?pattern.matcher(queryStringOr);Matcher?matcherAnd?=?pattern.matcher(queryStringAnd);Map<String,?Matcher>?matcherMap?=?new?ConcurrentHashMap<>();matcherMap.put("matcherOr",?matcherOr);matcherMap.put("matcherAnd",?matcherAnd);return?matcherMap;} }

Predicate的邏輯如下:

import?java.util.ArrayList; import?java.util.List;import?com.querydsl.core.types.dsl.BooleanExpression;/***?This?class?is?mainly?used?to?classify?all?the?query?parameters*/ public?class?PredicateBuilder?{private?static?final?String?BLANK_STRING?=?"?";private?static?final?String?TILDE_STRING?=?"~~";private?List<SearchCriteria>?paramsOr;private?List<SearchCriteria>?paramsAnd;private?BusinessPartnerMessageProvider?messageProvider;public?PredicateBuilder(BusinessPartnerMessageProvider?messageProvider){paramsOr?=?new?ArrayList<>();paramsAnd?=?new?ArrayList<>();}public?PredicateBuilder?withOr(String?key,?String?operation,?Object?value)?{String?keyAfterConverted?=?keyConverter(key);Object?valueAfterConverted?=?value.toString().replaceAll(TILDE_STRING,BLANK_STRING).trim();paramsOr.add(new?SearchCriteria(keyAfterConverted,?operation,?valueAfterConverted));return?this;}public?PredicateBuilder?withAnd(String?key,?String?operation,?Object?value)?{String?keyAfterConverted?=?keyConverter(key);Object?valueAfterConverted?=?value.toString().replaceAll(TILDE_STRING,BLANK_STRING).trim();paramsAnd.add(new?SearchCriteria(keyAfterConverted,?operation,?valueAfterConverted));return?this;}protected?String?keyConverter(String?key){return?key;}public?BooleanExpression?buildOr(Class?classType)?{return?handleBPBooleanExpressionOr(classType);}public?BooleanExpression?buildAnd(Class?classType)?{return?handleBPBooleanExpressionAnd(classType);}private?BooleanExpression?handleBPBooleanExpressionOr(Class?classType)?{if?(paramsOr.isEmpty())?{return?null;}return?buildBooleanExpressionOr(paramsOr,?classType);}private?BooleanExpression?handleBPBooleanExpressionAnd(Class?classType)?{if?(paramsAnd.isEmpty())?{return?null;}return?buildBooleanExpressionAnd(paramsAnd,?classType);}private?BooleanExpression?buildBooleanExpressionOr(List<SearchCriteria>?paramsOr,?Class?classType){List<BooleanExpression>?predicates?=?new?ArrayList<>();BooleanExpressionBuilder?predicate;for?(SearchCriteria?param?:?paramsOr)?{predicate?=?new?BooleanExpressionBuilder(param,?messageProvider);BooleanExpression?exp?=?predicate.buildPredicate(classType);if?(exp?!=?null)?{predicates.add(exp);}}BooleanExpression?result?=?null;if(!predicates.isEmpty())?{result?=?predicates.get(0);for?(int?i?=?1;?i?<?predicates.size();?i++)?{result?=?result.or(predicates.get(i));}}return?result;}private?BooleanExpression?buildBooleanExpressionAnd(List<SearchCriteria>?paramsAnd,?Class?classType){List<BooleanExpression>?predicates?=?new?ArrayList<>();BooleanExpressionBuilder?predicate;for?(SearchCriteria?param?:?paramsAnd)?{predicate?=?new?BooleanExpressionBuilder(param,?messageProvider);BooleanExpression?exp?=?predicate.buildPredicate(classType);if?(exp?!=?null)?{predicates.add(exp);}}BooleanExpression?result?=?null;if(!predicates.isEmpty())?{result?=?predicates.get(0);for?(int?i?=?1;?i?<?predicates.size();?i++)?{result?=?result.and(predicates.get(i));}}return?result;}}

BooleanExpressionBuilder的邏輯如下:

import?java.text.ParseException; import?java.text.SimpleDateFormat; import?java.time.ZoneOffset; import?java.util.Date; import?java.util.TimeZone;import?com.querydsl.core.types.dsl.BooleanExpression; import?com.querydsl.core.types.dsl.BooleanPath; import?com.querydsl.core.types.dsl.DateTimePath; import?com.querydsl.core.types.dsl.NumberPath; import?com.querydsl.core.types.dsl.PathBuilder; import?com.querydsl.core.types.dsl.StringPath;public?class?BooleanExpressionBuilder?{private?SearchCriteria?criteria;private?BusinessPartnerMessageProvider?messageProvider;private?static?final?String?NO_SUCH_FILED_MESSAGE?=?"NO_SUCH_FIELD_FOR_QUERY_PARAMETER";public?BooleanExpressionBuilder(final?SearchCriteria?criteria?)?{this.criteria?=?new?SearchCriteria(criteria.getKey(),criteria.getOperation(),criteria.getValue());}public?BooleanExpression?buildPredicate(Class?classType)?{//?the?second?param?for?PathBuilder?constructor?is?the?binding?path.PathBuilder<Class>?entityPath?=?new?PathBuilder<>(classType,?classType.getSimpleName());Boolean?isValueMatchEndWith?=?criteria.getValue().toString().endsWith("*");Boolean?isValueMatchStartWith?=?criteria.getValue().toString().startsWith("*");Boolean?isOperationColon?=?":".equalsIgnoreCase(criteria.getOperation());int?searchValueLength?=?criteria.getValue().toString().length();StringPath?stringPath?=?entityPath.getString(criteria.getKey());DateTimePath<Date>?timePath?=?entityPath.getDateTime(criteria.getKey(),?Date.class);NumberPath<Integer>?numberPath?=?entityPath.getNumber(criteria.getKey(),?Integer.class);if?((isOperationColon)?&&?(!isValueMatchStartWith)?&&?(!isValueMatchEndWith))?{return?getEqualBooleanExpression(classType,?entityPath,?stringPath,?timePath,?numberPath);}if?(">".equalsIgnoreCase(criteria.getOperation()))?{return?getGreaterThanBooleanExpression(classType,?timePath,?numberPath);}if?("<".equalsIgnoreCase(criteria.getOperation()))?{return?getLessThanBooleanExpression(classType,?timePath,?numberPath);}// !:means !=if?("!:".equalsIgnoreCase(criteria.getOperation()))?{return?getNotEqualBooleanExpression(classType,?entityPath,stringPath,?timePath,?numberPath);}//start?with?xxxif?((isOperationColon)?&&?isValueMatchEndWith?&&?(!isValueMatchStartWith))?{if?(isSearchKeyValidForClass(classType))return?stringPath.startsWithIgnoreCase(criteria.getValue().toString().substring(0,?searchValueLength?-?1).trim());}if?((isOperationColon)?&&?(!isValueMatchEndWith)?&&?(isValueMatchStartWith))?{if?(isSearchKeyValidForClass(classType))return?stringPath.endsWithIgnoreCase(criteria.getValue().toString().substring(1,?searchValueLength).trim());}//contain?xxxif?((isOperationColon)?&&?isValueMatchEndWith?&&?isValueMatchStartWith)?{return?getContainsBooleanExpression(classType,?searchValueLength,?stringPath);}return?null;}private?BooleanExpression?getContainsBooleanExpression(Class?classType,int?searchValueLength,?StringPath?stringPath)?{try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(String.class)?&&?searchValueLength>1)?{return?stringPath.containsIgnoreCase(criteria.getValue().toString().substring(1,searchValueLength-1).trim());}//if?there?are?only?a?"*"?in?the?seatch?value,?thenif(fieldType.equals(String.class)?&&?searchValueLength==1){return?stringPath.eq(criteria.getValue().toString());}}?catch?(NoSuchFieldException?|?SecurityException?e)?{}return?null;}private?boolean?isSearchKeyValidForClass(Class?classType)?{try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(String.class))?{return?true;}}?catch?(NoSuchFieldException?|?SecurityException?e)?{throw?new?BadRequestValidationException(messageProvider.getMessage(NO_SUCH_FILED_MESSAGE,new?Object[]?{?criteria.getKey()?}),?e);}return?false;}private?BooleanExpression?getNotEqualBooleanExpression(Class?classType,?PathBuilder<Class>?entityPath,StringPath?stringPath,?DateTimePath<Date>?timePath,?NumberPath<Integer>?numberPath)?{try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(Date.class))?{dateTimeValueConverter();return?timePath.ne((Date)?criteria.getValue());}if?(fieldType.equals(Integer.class))?{int?value?=?Integer.parseInt(criteria.getValue().toString());return?numberPath.ne(value);}if?(fieldType.equals(String.class))?{return?stringPath.ne(criteria.getValue().toString());}if?(fieldType.equals(boolean.class))?{booleanConverter();BooleanPath?booleanPath?=?entityPath.getBoolean(criteria.getKey());return?booleanPath.ne((Boolean)?criteria.getValue());}if?(fieldType.equals(Boolean.class))?{booleanConverter();BooleanPath?booleanPath?=?entityPath.getBoolean(criteria.getKey());return?booleanPath.ne((Boolean)?criteria.getValue());}}?catch?(NoSuchFieldException?|?SecurityException?e)?{throw?new?BadRequestValidationException();}return?null;}private?BooleanExpression?getLessThanBooleanExpression(Class?classType,DateTimePath<Date>?timePath,?NumberPath<Integer>?numberPath)?{try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(Date.class))?{dateTimeValueConverter();return?timePath.lt((Date)?criteria.getValue());}if?(fieldType.equals(Integer.class))?{integerValueConverter();return?numberPath.lt((Integer)?criteria.getValue());}}?catch?(NoSuchFieldException?|?SecurityException?e)?{throw?new?BadRequestValidationException(e.getCause());}return?null;}private?BooleanExpression?getGreaterThanBooleanExpression(Class?classType,DateTimePath<Date>?timePath,?NumberPath<Integer>?numberPath)?{//?other?data?types?do?not?make?sense?when?use?>try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(Date.class))?{dateTimeValueConverter();return?timePath.gt((Date)?criteria.getValue());}if?(fieldType.equals(Integer.class))?{integerValueConverter();return?numberPath.gt((Integer)?criteria.getValue());}}?catch?(NoSuchFieldException?|?SecurityException?e)?{throw?new?BadRequestValidationException(e.getCause());}return?null;}private?BooleanExpression?getEqualBooleanExpression(Class?classType,?PathBuilder<Class>?entityPath,?StringPath?stringPath,DateTimePath<Date>?timePath,?NumberPath<Integer>?numberPath)?{//?:means =try?{Class?fieldType?=?classType.getDeclaredField(criteria.getKey()).getType();if?(fieldType.equals(Integer.class))?{integerValueConverter();return?numberPath.eq((Integer)?criteria.getValue());}if?(fieldType.equals(Date.class))?{dateTimeValueConverter();return?timePath.eq((Date)?criteria.getValue());}if?(fieldType.equals(boolean.class))?{booleanConverter();BooleanPath?booleanPath?=?entityPath.getBoolean(criteria.getKey());return?booleanPath.eq((Boolean)?criteria.getValue());}if?(fieldType.equals(Boolean.class))?{booleanConverter();BooleanPath?booleanPath?=?entityPath.getBoolean(criteria.getKey());return?booleanPath.eq((Boolean)?criteria.getValue());}if?(fieldType.equals(String.class))?{return?stringPath.equalsIgnoreCase(criteria.getValue().toString());}}?catch?(NoSuchFieldException?|?SecurityException?e)?{throw?new?BadRequestValidationException(e.getCause());}return?null;}//?convert?string?to?datetimeprivate?void?dateTimeValueConverter()?{criteria.setValue(convertToTimeStamp(criteria.getValue().toString()));}private?void??booleanConverter()?{if?(criteria.getValue().toString().equalsIgnoreCase("true"))?{criteria.setValue(true);}?else?if?(criteria.getValue().toString().equalsIgnoreCase("false"))?{criteria.setValue(false);}?else?{throw?new?BadRequestValidationException("Invalid?Boolean");}}//?convert?string?to?Integerprivate?void?integerValueConverter()?{criteria.setValue(Integer.parseInt(criteria.getValue().toString()));}private?Date?convertToTimeStamp(String?time)?{//convert?date?herereturn?parsedDate;}}

查詢條件的抽象類SearchCriteria定義如下:

public?class?SearchCriteria?{private?String?key;private?String?operation;private?Object?value; }

大致的實現邏輯如下圖所示:

圖片

比較關鍵的點有下面這些:

  • 對字符串的解析需要借助正則表達式的幫助,正則表達式決定了我們支持怎樣的查詢.

  • 由于字符串可以任意輸入,存在無限種可能,對查詢字符串的校驗很關鍵也很復雜。

  • 不同邏輯的查詢條件需要存放在不同的容器里面,因為他們的拼接邏輯不一樣,一個是或一個是與

  • 不同的字段類型需要調用不同的生成Predicate的方法,例如String,Boolean和Date這些類型他們都有自己對應的查詢實現

  • 生成子表的Predicate很復雜,與主表的查詢條件一起查詢時邏輯更加復雜,上面的邏輯拿掉了這一部分。但是這個功能是可以實現的。

實現過程中的難題

主表包含多個子表數據時的AND查詢

距離說明,現在有數據定義如下:

{"customerNumber":?"5135116903","customerType":?"INDIVIDUAL","createdBy":?"Android.chen@sap.com","changedBy":?"Android.chen@sap.com","createdAt":?"2018-06-26T10:15:17.212Z","changedAt":?"2018-06-26T10:15:17.212Z","markets":?[{"marketId":?"A1","currency":?"USD","country":?"US","active":?true},?{"marketId":?"A2","currency":?"USD","country":?"US","active":?false},?{"marketId":?"A3","currency":?"USD","country":?"US","active":?true}] }

其中父節點表是customer,子節點markets信息存儲在market表當中。

現在,假設我們有這樣的查詢:

customerNumber:?5135116903?AND?markets.active:false

沒有疑問,上面的數據應該被查出來。現在查詢條件變成下面這樣:

customerNumber:?5135116903?AND?markets.active:false?AND?markets.marketId:A1

現在問題來了,語句的意思是此客戶的marker既要是非active 的且ID要是A1,但是此客戶又有多個market,從整個數組里來看,這個條件是滿足的。但是從單個的market個體來看這個條件是不滿足的。而我們作為用戶的話希望得到的效果必然是無法查處此customer信息。

這會給實現帶來問題,因為由于market是一個數組,在數據表中對應的就是幾條記錄,我們在解析并構建子表查詢時,必須確保對于子表的查詢條件是作用于單獨的一個node,也就是單獨的一條記錄,而不是從整個數組當中去查,否則就會有問題。

來源:https://blog.csdn.net/topdeveloperr

我們創建了一個高質量的技術交流群,與優秀的人在一起,自己也會優秀起來,趕緊點擊加群,享受一起成長的快樂。另外,如果你最近想跳槽的話,年前我花了2周時間收集了一波大廠面經,節后準備跳槽的可以點擊這里領取!

推薦閱讀

  • Spring Boot 生產中的 16 條最佳實踐

  • Stream轉List的新API,真是干凈又衛生啊!

  • 2分鐘學會IDEA中調試過程回退的2種方法

··································

你好,我是程序猿DD,10年開發老司機、阿里云MVP、騰訊云TVP、出過書創過業、國企4年互聯網6年。從普通開發到架構師、再到合伙人。一路過來,給我最深的感受就是一定要不斷學習并關注前沿。只要你能堅持下來,多思考、少抱怨、勤動手,就很容易實現彎道超車!所以,不要問我現在干什么是否來得及。如果你看好一個事情,一定是堅持了才能看到希望,而不是看到希望才去堅持。相信我,只要堅持下來,你一定比現在更好!如果你還沒什么方向,可以先關注我,這里會經常分享一些前沿資訊,幫你積累彎道超車的資本。

點擊領取2022最新10000T學習資料

總結

以上是生活随笔為你收集整理的SpringBoot + QueryDSL 大大简化复杂查询操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

av福利第一导航 | 在线观看中文字幕 | 欧美精品国产精品 | 青青草在久久免费久久免费 | 久国产在线播放 | 亚洲综合最新在线 | 国产精品白虎 | 婷婷亚洲激情 | 在线日韩一区 | 国产免费高清 | 一区二区三区电影在线播 | 99视频精品全国免费 | 日日爽夜夜爽 | 91av片| 97视频资源 | 日韩高清免费在线 | 一区中文字幕在线观看 | 91精品综合在线观看 | 精品视频在线看 | 四虎影视成人永久免费观看视频 | 天天色天天骑天天射 | 国产资源免费 | 人人讲下载| 中文字幕国语官网在线视频 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲成人软件 | 麻豆国产精品va在线观看不卡 | 国产精品自拍在线 | 日韩在线观看免费 | 狠狠色丁香婷婷综合久久片 | 久久黄色成人 | 久精品视频在线观看 | 五月婷婷综合在线视频 | 日韩av电影手机在线观看 | 午夜精品导航 | 日韩国产精品一区 | 不卡视频一区二区三区 | 久久精品网站免费观看 | 伊人永久在线 | 色综合色综合久久综合频道88 | 亚洲精品综合一二三区在线观看 | 在线国产一区二区三区 | 成人免费xxx在线观看 | 国产天天爽 | 成人免费在线视频观看 | 成人黄色在线电影 | 九九爱免费视频 | 日韩小视频网站 | www.久久婷婷 | 亚洲精品mv在线观看 | 天天曰天天爽 | 国产日韩三级 | 免费黄色在线播放 | 中文字幕av一区二区三区四区 | av片子在线观看 | 亚洲视频电影在线 | 激情伊人五月天 | 日韩三级在线 | 精品久久亚洲 | 韩国av免费在线 | 91av电影在线 | 国产高清久久久 | 国产高清成人 | 亚洲高清视频在线观看 | 国产精品久久精品 | 在线看片视频 | 免费毛片aaaaaa | 在线国产视频观看 | 国产一区二区三区视频在线 | 人人射网站| 国产精品一区专区欧美日韩 | 日韩中文字幕视频在线观看 | 亚洲精品国 | 一二三区在线 | 国产成人一区二区三区在线观看 | 日韩欧美亚州 | 久久一区二区三区日韩 | 九九久 | 国产高清免费视频 | 国产一区影院 | 国产成人一区二区在线观看 | 中文字幕在线看视频国产中文版 | 亚洲视频一区二区三区在线观看 | 日本精品一二区 | 亚洲精品一区二区在线观看 | 国产在线 一区二区三区 | 国产日韩视频在线观看 | 国产精品毛片一区二区 | 精品国产乱码久久久久 | 菠萝菠萝在线精品视频 | 免费观看国产精品视频 | 国产精品久久久久久久久久妇女 | 国产精品久久久久久久免费大片 | 91久久精品一区二区二区 | 免费欧美 | 黄色片视频在线观看 | 久久精品—区二区三区 | 免费在线视频一区二区 | 国产精品嫩草55av | 国产伦精品一区二区三区四区视频 | 最近中文字幕完整视频高清1 | 亚洲性xxxx| 在线免费观看国产 | 久久精品日产第一区二区三区乱码 | 久久午夜鲁丝片 | 又色又爽又黄 | 黄色在线观看污 | 日本在线h | 国产成人资源 | 中文字幕av免费观看 | 很黄很黄的网站免费的 | 日韩91精品 | 国产韩国精品一区二区三区 | 五月婷婷av在线 | 韩国av在线 | 日韩高清一二三区 | 久久久伊人网 | 日韩mv欧美mv国产精品 | 九九热免费在线观看 | 国产精品久久久久免费 | www.干| 久久免费视频3 | 成人免费色| 六月婷婷久香在线视频 | a黄色 | 欧美三级在线播放 | 亚洲伊人av | 五月天欧美精品 | www.777奇米| 五月天激情综合 | 国产精品免费观看视频 | 麻豆91在线 | 日本精a在线观看 | 天天干,夜夜操 | 91av在线播放视频 | 国产成人精品国内自产拍免费看 | 不卡的av中文字幕 | 天天干天天干天天 | 日韩精品一区二区在线视频 | 久久99网站 | 久久精品一二三 | 久久精品综合网 | 国产97超碰| 婷婷在线视频 | 欧美精品久久 | 九九免费在线观看视频 | 国产视频精品免费 | 欧美国产不卡 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 最近最新中文字幕视频 | 又爽又黄又无遮挡网站动态图 | 国产精久久久久久久 | 国产一级黄大片 | 国产精品久免费的黄网站 | 久久人人爽人人爽人人片av软件 | 伊甸园永久入口www 99热 精品在线 | 五月天天色 | 久久高清免费观看 | www免费在线观看 | 国产涩涩网站 | 一区二区三区中文字幕在线 | 中文av不卡 | 深爱激情站 | 成人av.com| 91视频3p| 成人一级在线观看 | 国产又粗又猛又黄视频 | 在线观看91网站 | 欧美性视频网站 | 欧美精品乱码久久久久久按摩 | 欧美小视频在线观看 | 人人澡人人爽欧一区 | 国精产品999国精产 久久久久 | 欧美一进一出抽搐大尺度视频 | 久久av观看| 精品久久久久久久久中文字幕 | 国产精品美女久久久久aⅴ 干干夜夜 | 久久成人高清 | av天天在线观看 | 五月婷香蕉久色在线看 | 日韩高清在线观看 | a级黄色片视频 | 久久久麻豆精品一区二区 | 国产小视频免费在线观看 | 天天伊人狠狠 | 国产精选在线观看 | 一级黄色大片 | www.69xx| 色综合久久久久久久久五月 | 天天天操操操 | 亚洲撸撸 | 日韩电影中文字幕 | 国产二区视频在线 | 在线电影 你懂得 | 精品主播网红福利资源观看 | 成人av在线电影 | 亚州精品天堂中文字幕 | 欧美日韩不卡一区二区三区 | 国产精品va在线观看入 | 天天操天天射天天 | 国产大尺度视频 | www.在线观看av | 久亚洲 | 精品一区二区三区久久 | 欧美性天天 | 精品黄色视| 成人在线视频你懂的 | 久草免费在线 | 久产久精国产品 | av网站在线观看免费 | 久久精品亚洲精品国产欧美 | 激情开心色 | 国内精品久久久久国产 | 激情网站网址 | 国产精品美女毛片真酒店 | 91精品国自产拍天天拍 | 国产精品久免费的黄网站 | 麻豆精品国产传媒 | 在线观看视频中文字幕 | av先锋中文字幕 | 日韩城人在线 | 亚洲免费观看在线视频 | 午夜狠狠操 | 又爽又黄又刺激的视频 | 日韩在线观看视频在线 | 免费a v视频 | 一区二区不卡在线观看 | 国产麻豆剧果冻传媒视频播放量 | 国产一卡在线 | 国产精品一区二 | 国产精品99久久99久久久二8 | 国产五月婷 | 91在线免费公开视频 | 久久九九久久九九 | 在线之家官网 | 999久久久国产精品 高清av免费观看 | 国产精品成人aaaaa网站 | 欧美激情精品久久 | 最新av在线网站 | 精品美女久久久久 | 91九色精品女同系列 | 麻豆视频国产在线观看 | 国产亚洲精品久久久久久移动网络 | 久久国产精品99国产精 | 日日日爽爽爽 | 亚洲精品成人在线 | 久精品视频在线观看 | 国产精品第一 | 欧美日韩亚洲在线 | 亚洲男男gaygayxxxgv | 久久伦理视频 | 91丨九色丨国产女 | 最近2019好看的中文字幕免费 | 国产免费小视频 | 久草视频手机在线 | 亚洲理论视频 | 一本一道久久a久久综合蜜桃 | 激情视频亚洲 | 夜夜婷婷 | 欧美日韩一区二区视频在线观看 | 99在线精品视频 | 草 免费视频 | 国产亚洲精品久久久久久电影 | 婷婷在线看 | 久草爱视频 | 99热在 | 亚洲美女在线一区 | 免费又黄又爽视频 | 天天婷婷| 亚洲欧美日韩在线看 | 久章操| 在线看免费 | 三级黄色片在线观看 | 亚洲视频在线观看 | 成人一级在线观看 | 国产黄色一级大片 | 日韩成人精品一区二区三区 | 96超碰在线 | 黄色av一区 | 特黄特黄的视频 | 综合天天网 | 亚洲一区精品人人爽人人躁 | 欧美久久久久久 | 中文字幕亚洲五码 | 国产精品一区久久久久 | 91九色成人蝌蚪首页 | 成人免费在线视频 | 日韩视频一区二区三区在线播放免费观看 | 亚洲精品欧美成人 | 奇米网在线观看 | 精品国产理论 | 欧美成人精品三级在线观看播放 | 九九九热精品免费视频观看网站 | 人成午夜视频 | 91在线视频免费91 | 欧美a级一区二区 | 国产精品小视频网站 | 免费av成人在线 | 最近中文字幕免费 | 亚洲国产精品视频在线观看 | 亚洲精品国产综合久久 | 91香蕉视频色版 | 午夜精品久久久久久久99婷婷 | 免费看一级特黄a大片 | 免费观看完整版无人区 | 最新午夜 | 久久亚洲私人国产精品va | 免费热情视频 | 欧美男男激情videos | 天天综合成人 | 成人在线观看av | 国产精品粉嫩 | 亚洲精色 | 蜜桃av观看| 日韩精品在线播放 | 久久久久免费观看 | 国产手机在线 | 久久99久久99精品免观看粉嫩 | 久久久国产精品视频 | 91福利在线观看 | www久久九 | 国产91av视频在线观看 | av一级在线观看 | 天天干,夜夜操 | 亚洲综合干 | 欧美日韩国产在线精品 | 国产免费av一区二区三区 | 黄色av一区二区 | 成人亚洲综合 | 免费午夜在线视频 | 国产精品久久一 | 一区二区不卡在线观看 | 成人午夜黄色影院 | 91成人在线观看喷潮 | 久久视频在线观看中文字幕 | 日韩在线播放视频 | 人成在线免费视频 | 日韩精品中文字幕久久臀 | 91影视成人| www.日日日.com | 国产精品麻豆三级一区视频 | 亚洲午夜精品久久久久久久久久久久 | 精品成人国产 | 亚洲精品婷婷 | 中文视频在线 | 91黄色在线看 | 欧美日韩xx | 天干啦夜天干天干在线线 | 黄色99视频 | 国产在线a | 国产精品久久影院 | 婷婷色五| 日韩丝袜在线观看 | www.久草视频 | 久草热久草视频 | 欧美色图亚洲图片 | 91成人精品国产刺激国语对白 | 免费看黄色毛片 | 在线免费观看麻豆 | 亚洲欧美在线综合 | 五月婷在线视频 | av成人免费在线看 | 综合久久久 | 日韩久久久 | 国产在线探花 | 777奇米四色 | 菠萝菠萝蜜在线播放 | 日韩高清一二三区 | 欧美另类v | av中文字幕网站 | 天天操天天拍 | 99视频精品免费观看, | 麻豆免费精品视频 | 日日夜精品| 最近中文字幕大全 | 国产亚洲精品v | 亚洲欧洲精品一区二区精品久久久 | 91综合久久一区二区 | 亚洲欧洲精品视频 | 黄色午夜网站 | 久日精品 | 91污污视频在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 久久久久99精品成人片三人毛片 | 欧美色图东方 | 免费看黄在线网站 | 国产三级视频在线 | 黄色av网站在线观看免费 | 激情综合六月 | 精品久久久久久国产 | 欧美日本在线视频 | 国产精品免费在线播放 | 一区二区三区精品久久久 | 亚洲精品视频在线观看免费视频 | 99re中文字幕 | 亚洲精品久久久久久久不卡四虎 | 亚洲精品1区2区3区 超碰成人网 | 91免费视频网站在线观看 | 国内精品久久久久 | 啪啪精品 | 91大神在线看 | 欧美日本一区 | 69av国产| 免费视频 三区 | 午夜精品成人一区二区三区 | 亚洲精选视频在线 | 天天综合网 天天综合色 | 国产精品porn| 国产午夜麻豆影院在线观看 | 伊色综合久久之综合久久 | 精品久久美女 | 九九精品视频在线观看 | 久久理伦片 | 97视频免费在线看 | 99精品区 | 97小视频 | 超碰97在线资源站 | 婷婷丁香激情五月 | 天天激情在线 | 日韩午夜电影 | 国产精品久99 | 在线黄色av电影 | 婷婷 中文字幕 | 最近日本韩国中文字幕 | 中文字幕在线观看免费高清完整版 | www.夜夜夜| 久久久免费观看完整版 | 久久免费黄色 | 黄色av三级在线 | 九九热免费在线视频 | av不卡中文 | 国产福利91精品 | 91精品视频一区 | 99视频精品全国免费 | 欧美成人精品三级在线观看播放 | 国产一级性生活视频 | 97人人人人 | 黄色av免费看 | 91麻豆精品一区二区三区 | 超碰99在线 | 91精品视频在线免费观看 | 伊人av综合 | www.伊人网| 国产精品黄色 | 91欧美精品 | 黄色av电影网 | 激情大尺度视频 | 国产精品成人免费精品自在线观看 | 中文在线天堂资源 | 久久dvd| 国产精品综合在线观看 | 久热只有精品 | 中文区中文字幕免费看 | 中文字幕国内精品 | 精品国产一区二区三区久久久蜜臀 | 日韩精品视频第一页 | www免费看| 五月婷婷色播 | 成人免费视频a | 婷婷国产v亚洲v欧美久久 | 久色伊人 | 国产成人久久久久 | 国产网红在线观看 | 五月天久久 | 免费成人在线观看 | 亚洲色图激情文学 | 欧美一区日韩精品 | 成人午夜免费福利 | 精品v亚洲v欧美v高清v | 五月激情丁香婷婷 | 日韩精品免费 | 九九热1 | 日韩久久久久久久久 | 成人在线观看你懂的 | 久久久夜色 | 五月色丁香 | 婷婷丁香综合 | 国色天香在线 | 精品美女久久久久久免费 | 精品久久91| 中文字幕第一页在线播放 | 亚洲国产中文字幕在线 | 亚洲成年人av | 天天射天天干天天操 | 伊人开心激情 | a色网站 | 曰韩精品 | 91黄色影视| 中日韩免费视频 | 天天干夜夜爱 | 欧美日韩国产精品一区二区亚洲 | 一级片视频免费观看 | 日韩一级黄色av | 一级黄色片在线免费看 | 久久久久久久久久久久av | 国产黄色精品在线 | 国产特级毛片aaaaaa毛片 | 亚洲午夜久久久综合37日本 | 天天干天天怕 | 久久精品欧美日韩精品 | 2021国产在线视频 | 成人在线免费视频 | 国产免费不卡 | 国产剧情一区在线 | 亚洲激情五月 | 亚洲一二视频 | 成人免费在线观看入口 | 国产精品久久二区 | 最新日韩电影 | 9幺看片| 伊人伊成久久人综合网小说 | 久久夜视频 | 国产在线播放一区 | 久久久久电影网站 | 亚洲综合射 | 国产成人av一区二区三区在线观看 | 激情五月婷婷综合网 | 欧美日韩精品在线视频 | 黄色a视频 | 国产亚洲精品精品精品 | 中文字幕亚洲欧美日韩 | av一级片在线观看 | 麻豆免费精品视频 | 色五月色开心色婷婷色丁香 | 九九热精品视频在线播放 | 久久国产高清 | 美女免费视频观看网站 | 国产剧情av在线播放 | 九九视频免费观看视频精品 | 色停停五月天 | 亚洲精品乱码久久久久久蜜桃欧美 | 黄色小说视频在线 | 国产无吗一区二区三区在线欢 | 最新日本中文字幕 | 久久久久福利视频 | 中文字幕之中文字幕 | 中文字幕色网站 | 久久久久久久久久久网站 | 亚洲一级电影视频 | 免费看成人片 | 999亚洲国产996395| 日韩a级免费视频 | 国产无套视频 | 中文字幕av播放 | www久久久 | 五月婷婷六月综合 | 久久人人看 | 婷婷综合伊人 | av理论电影 | 国产精品ⅴa有声小说 | av电影在线观看完整版一区二区 | 在线观看的av网站 | 99精品福利| 一区二区三区在线免费 | 国产精品一区二区三区在线播放 | 日本三级不卡视频 | 欧美专区国产专区 | av 一区二区三区 | 久久不卡国产精品一区二区 | 国产成人精品久久久久蜜臀 | 97影视 | 亚洲国产三级在线 | 亚洲国产精品一区二区久久hs | 久久综合久久综合这里只有精品 | 9999在线 | 五月天国产精品 | 日本久久久精品视频 | 激情丁香综合 | 超碰在线最新网址 | 亚洲综合精品在线 | 久久人人97超碰com | 五月天亚洲激情 | 欧美美女视频在线观看 | 国产品久精国精产拍 | 91成人久久| 日韩免费b| 日日爽天天 | 综合久久精品 | 一区二区三区四区在线 | 玖玖在线资源 | 日本性xxxxx 亚洲精品午夜久久久 | av高清网站在线观看 | 日本中文字幕网址 | 99激情网| 91精品视频在线 | 午夜av大片 | 日韩av一区二区三区在线观看 | 天天干天天摸 | 国产高清黄 | www久久99| 国产精品高潮呻吟久久av无 | 国产小视频网站 | 国产精品手机播放 | 精品久久久久久亚洲综合网站 | 天天操狠狠干 | 超碰公开在线 | 人人舔人人干 | 中文字幕丰满人伦在线 | 天天综合网国产 | 五月开心网 | 成人亚洲综合 | 天堂网中文在线 | av免费高清观看 | 国产精品自产拍 | 午夜黄色 | 欧美日韩国产二区 | 久久伊人五月天 | 久久无码精品一区二区三区 | 国产在线观看 | 最近高清中文字幕在线国语5 | 激情网站免费观看 | 91爱在线| 色婷五月 | 最新亚洲视频 | japanese黑人亚洲人4k | 天天色天天综合网 | 国产精品久久久久久久久久久久 | 国产成人久久精品亚洲 | 久久精品久久精品 | 国产精品国产三级国产aⅴ9色 | www.五月天色 | 久久精品—区二区三区 | 日韩国产精品久久久久久亚洲 | 亚洲精品国产第一综合99久久 | 欧美a免费 | 日韩一区二区三区高清在线观看 | 天天做天天看 | 免费福利在线 | 国产一区久久久 | 国产中出在线观看 | 最近更新好看的中文字幕 | 在线婷婷 | 在线看国产 | 欧美色图一区 | 免费视频在线观看网站 | 午夜一级免费电影 | av在线之家电影网站 | 亚洲在线成人精品 | 国产精品第十页 | 久久免费视频在线观看 | 人人澡人人爱 | 精品国产自在精品国产精野外直播 | 成人电影毛片 | 日韩在线视频一区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 欧美国产精品久久久久久免费 | 日韩av片无码一区二区不卡电影 | 国产亚洲精品久久久久秋 | 91在线小视频 | 国产精品免费在线观看视频 | 久久爱资源网 | 亚洲国产精品久久久 | 国产一区二区三区视频在线 | 中文字幕有码在线播放 | 久要激情网 | 色视频网页| 免费看黄在线网站 | 开心激情网五月天 | www.色午夜.com | 亚洲区另类春色综合小说校园片 | 丁香五月亚洲综合在线 | av中文天堂| 日韩欧美精品一区 | 久久久免费精品国产一区二区 | 五月天久久综合网 | 五月婷影院 | 婷婷网站天天婷婷网站 | 五月天婷婷免费视频 | 国产免费a | 欧美日韩18 | 97超级碰碰碰视频在线观看 | 99久久精品国产毛片 | 国产精品久久久久久久久毛片 | 操处女逼 | 国产精品久久99综合免费观看尤物 | 中文字幕精品在线 | 美女国产在线 | 色综合天天狠狠 | 亚洲视频每日更新 | 免费福利片| 日韩电影一区二区在线 | 亚洲一区二区91 | 国产成人亚洲在线观看 | 久久国产经典 | 国产九九精品视频 | 三级黄色免费片 | 热久久免费国产视频 | 午夜精品av | 亚洲天堂色婷婷 | 国产精品igao视频网网址 | 国产一级精品在线观看 | 亚洲精品乱码久久久久久按摩 | 国产黄色片免费 | 国产高潮久久 | 婷婷六月天天 | 香蕉久久久久久av成人 | 黄色h在线观看 | 久久老司机精品视频 | 97超碰国产在线 | 在线亚洲欧美日韩 | 91精品国产九九九久久久亚洲 | 欧美日韩免费观看一区=区三区 | 国产精品久久久久久久午夜 | 午夜久久电影网 | 成人在线视频论坛 | 欧洲性视频 | 在线视频一二三 | 五月天色婷婷丁香 | 精品在线亚洲视频 | 美女国产在线 | 亚洲最新视频在线播放 | 国产一区不卡在线 | 日本黄色免费在线观看 | 奇米网8888 | 在线观看中文字幕2021 | 不卡中文字幕在线 | 国产资源在线免费观看 | 色婷婷色 | 天天摸夜夜操 | 久久久综合香蕉尹人综合网 | 久久黄色免费视频 | 精品国产电影一区二区 | 五月天久久久久久 | 综合色伊人| 日韩免费一区二区三区 | 日韩一区二区免费播放 | 国产高清av免费在线观看 | 国产成人福利片 | 日韩一级电影在线 | 成人av午夜| 欧美大片aaa | 开心激情五月网 | 激情影院在线观看 | 免费网站黄 | 午夜少妇一区二区三区 | 在线观看免费成人av | 天堂av一区二区 | 视频在线国产 | 亚洲年轻女教师毛茸茸 | 亚洲国产一区二区精品专区 | 亚洲女同ⅹxx女同tv | 国产99一区| 在线视频日韩 | 狠狠狠狠狠操 | 国产精品1区 | 色狠狠一区二区 | 欧美日韩在线视频一区二区 | 日韩有码在线播放 | 少妇搡bbbb搡bbb搡忠贞 | 91色视频 | 免费黄色一区 | 亚洲一区在线看 | 欧美在线一二 | 国产麻豆精品95视频 | 91爱看片 | 日韩欧美一区二区在线播放 | 国产精品色婷婷视频 | 日韩中文字幕91 | 九九热视频在线播放 | 久久精品亚洲一区二区三区观看模式 | 91精品第一页| 美女黄濒 | 天天综合网国产 | 五月天综合网站 | 91天天操| 久久久久99999 | 亚洲综合在线视频 | 成人97视频一区二区 | 一区二区在线影院 | 成人午夜电影在线播放 | 欧美日韩首页 | 中文在线中文资源 | 91精品视频免费观看 | 欧洲一区二区在线观看 | 成年人视频在线免费播放 | 日日久视频 | 成人黄色大片在线观看 | 中文字幕观看av | 国产一区视频在线播放 | 久久国产经典视频 | 狠狠的操狠狠的干 | 欧美久久久影院 | 亚洲色图27p | 成人国产精品久久久春色 | 国产精品久久久久永久免费观看 | 久久精品成人欧美大片古装 | 狠狠干天天 | 五月婷婷丁香激情 | 日韩免费观看高清 | 高清av网站| 五月婷婷综合在线观看 | 久久久久久久久网站 | 在线91精品 | 国产午夜精品久久久久久久久久 | 亚洲成人资源在线观看 | 免费亚洲视频 | 在线一区二区三区 | 国产精品一区二区av | 正在播放亚洲精品 | 久久国产精品色av免费看 | 五月天久久久久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 国产在线999 | 黄色片毛片| av大全在线观看 | 开心丁香婷婷深爱五月 | 在线国产能看的 | 欧美性受极品xxxx喷水 | 97日日碰人人模人人澡分享吧 | 四虎影视成人精品国库在线观看 | 国产小视频在线免费观看视频 | 国产高清视频免费最新在线 | 国产精品久久久区三区天天噜 | 欧美性久久久久久 | 国产高清视频网 | 久久婷婷国产色一区二区三区 | 草久中文字幕 | 最近日本中文字幕 | 亚洲精品中文在线 | 美女免费视频一区二区 | 操操操综合 | 国产视频欧美视频 | 五月综合色| 国产拍揄自揄精品视频麻豆 | 深夜精品福利 | 美女视频黄免费的 | 99热精品久久 | 日韩高清不卡在线 | 久久国产精品免费看 | 亚洲在线视频免费观看 | 尤物97国产精品久久精品国产 | 久影院| 丁香伊人网 | 婷婷色在线播放 | 国产精品一区二区久久久久 | www.久久91 | 久久精品一二三区 | 婷婷丁香花五月天 | 黄在线| www视频在线免费观看 | 久久久久免费 | 高清av在线 | 亚洲国产中文字幕在线 | 中文字幕国产视频 | 91av综合| 三级av免费| 欧美一区二区在线刺激视频 | 西西大胆啪啪 | 国产精品18毛片一区二区 | 99电影456麻豆 | 日韩视频免费 | 日韩性片| 天天精品视频 | 久久国产精品成人免费浪潮 | 国产一区二区三精品久久久无广告 | 亚洲国产精彩中文乱码av | www.天天草 | 91精品视频免费观看 | 免费精品视频 | 久久av伊人| 久久综合久久综合九色 | 国产精品自拍av | 中文字幕中文字幕中文字幕 | 91超碰免费在线 | av一级在线观看 | 伊人成人激情 | 久久国产美女 | 四虎影视国产精品免费久久 | 国产免费精彩视频 | 成年人毛片在线观看 | 亚洲综合视频网 | 欧美粗又大 | 天堂v中文 | 日韩精品免费在线 | 日韩欧美视频免费看 | 国产在线不卡精品 | 免费视频一区 | 永久免费看av | av线上免费看 | 国产精品久久久久av福利动漫 | 亚洲精品国偷拍自产在线观看 | 五月激情姐姐 | 国产精品高清一区二区三区 | 日批视频在线观看免费 | 玖玖玖国产精品 | 9在线观看免费高清完整 | 2021国产在线视频 | 激情婷婷网 | av夜夜操| 日韩在线观看视频中文字幕 | 成人黄色电影视频 | 依人成人综合网 | 911国产精品| 在线看日韩 | 欧美日韩大片在线观看 | 久久免费毛片视频 | 玖玖玖国产精品 | 欧美亚洲精品在线观看 | 国产伦精品一区二区三区… | 日韩精品视频免费看 | 亚洲人在线视频 | 天天干天天想 | 国产成人亚洲精品自产在线 | 91视频a| 人人澡人人爽欧一区 | 国产精品一区二区三区四区在线观看 | 成人在线黄色电影 | av在线h| 中文字幕亚洲在线观看 | 日韩区在线观看 | 久久深夜| 九九九热视频 | 六月婷婷网 | 日韩欧美一区二区不卡 | 中文字幕人成一区 | 日日干激情五月 | 99久久夜色精品国产亚洲96 | 新av在线| 麻豆观看 | 香蕉在线视频播放网站 | 久久99热这里只有精品 | 99久久精品国产免费看不卡 | 亚洲一级二级 | 国产精品久久久久三级 | 亚洲六月丁香色婷婷综合久久 | 色搞搞 | 欧美最新大片在线看 | 狠狠干婷婷 | 欧美色综合天天久久综合精品 | 欧美性黄网官网 | 99视频精品 | 99色国产| 99久久精品免费看国产 | 亚洲精品成人 | 天天操夜夜拍 | 激情av一区二区 | 爱射综合 | 久久免费视频3 | 久久免费观看少妇a级毛片 久久久久成人免费 | 狠狠色伊人亚洲综合成人 | 91在线欧美 | 蜜桃麻豆www久久囤产精品 | 在线观看视频在线 | 久久精品久久精品 | 免费亚洲视频在线观看 | 99热精品免费观看 | 99精品国产一区二区 | 色在线最新 | 黄视频色网站 | 精品一区二区久久久久久久网站 | 91精品综合在线观看 | 人人爽人人av | 国产亚州av | 欧美在线视频a | www操操| 国产在线精品一区二区三区 | 日韩无在线 | 亚洲综合国产精品 | 色姑娘综合天天 | 国产黄色片免费在线观看 | 91精品国产综合久久久久久久 | 人人插人人看 | 天天干人人| 精品久久久久久久久亚洲 | 欧美日韩一区三区 | 成人av一级片 | 日韩在线观看免费 | 国产精品青草综合久久久久99 | 国产做aⅴ在线视频播放 | 丁香国产视频 | 精品在线观看一区二区 | 日韩欧美高清在线观看 | 热re99久久精品国产66热 | 亚洲第一香蕉视频 | 伊人官网 | 色综合五月天 | 欧美日韩精品在线观看视频 | 超碰在线日韩 | 欧美在线一二 | 午夜精品一区二区三区视频免费看 | 国产精品岛国久久久久久久久红粉 | 1000部国产精品成人观看 | 91免费黄视频 | 草久电影 | 国产一级在线免费观看 | 精品国产乱码久久 | 国产99免费视频 | 四虎影视精品成人 | 91久久偷偷做嫩草影院 | 久久夜靖品 | 亚洲视频456 | 婷婷伊人五月 | 成片免费观看视频 | 国产日韩精品一区二区在线观看播放 | 免费在线黄| 成人小视频在线观看免费 | 色精品视频| 国产一级视频在线观看 |