001/*
002 *  Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 *  <p>
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *  <p>
008 *  http://www.apache.org/licenses/LICENSE-2.0
009 *  <p>
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package com.mybatisflex.core.query;
017
018import com.mybatisflex.core.FlexConsts;
019import com.mybatisflex.core.constant.SqlConnector;
020import com.mybatisflex.core.constant.SqlConsts;
021import com.mybatisflex.core.constant.SqlOperator;
022import com.mybatisflex.core.dialect.DialectFactory;
023import com.mybatisflex.core.table.TableDef;
024import com.mybatisflex.core.table.TableInfo;
025import com.mybatisflex.core.table.TableInfoFactory;
026import com.mybatisflex.core.util.ArrayUtil;
027import com.mybatisflex.core.util.ClassUtil;
028import com.mybatisflex.core.util.CollectionUtil;
029import com.mybatisflex.core.util.LambdaGetter;
030import com.mybatisflex.core.util.LambdaUtil;
031import com.mybatisflex.core.util.SqlUtil;
032import com.mybatisflex.core.util.StringUtil;
033
034import java.util.ArrayList;
035import java.util.Arrays;
036import java.util.Collection;
037import java.util.Collections;
038import java.util.List;
039import java.util.Map;
040import java.util.function.BooleanSupplier;
041import java.util.function.Consumer;
042import java.util.function.Predicate;
043
044public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
045
046    public static QueryWrapper create() {
047        return new QueryWrapper();
048    }
049
050    /**
051     * 根据实体类对象,构建查询条件
052     *
053     * @param entity 实体类对象
054     * @return 查询对象 QueryWrapper
055     */
056    public static QueryWrapper create(Object entity) {
057        TableInfo tableInfo = TableInfoFactory.ofEntityClass(ClassUtil.getUsefulClass(entity.getClass()));
058        return tableInfo.buildQueryWrapper(entity, null);
059    }
060
061    /**
062     * 根据实体类构建查询条件
063     *
064     * @param entity    实体类对象
065     * @param operators 每个属性对应的操作符
066     * @return 查询对象 QueryWrapper
067     */
068    public static QueryWrapper create(Object entity, SqlOperators operators) {
069        TableInfo tableInfo = TableInfoFactory.ofEntityClass(ClassUtil.getUsefulClass(entity.getClass()));
070        return tableInfo.buildQueryWrapper(entity, operators);
071    }
072
073    /**
074     * 根据 Map 对象,构建查询条件
075     *
076     * @param map Map 对象
077     * @return 查询对象 QueryWrapper
078     */
079    public static QueryWrapper create(Map map) {
080        return create().where(map);
081    }
082
083    /**
084     * 根据 Map 构建查询条件
085     *
086     * @param map       Map 对象
087     * @param operators 每个属性对应的操作符
088     * @return 查询对象 QueryWrapper
089     */
090    public static QueryWrapper create(Map map, SqlOperators operators) {
091        return create().where(map, operators);
092    }
093
094
095    @SuppressWarnings("unchecked")
096    public <Q extends QueryWrapper> WithBuilder<Q> with(String name) {
097        if (with == null) {
098            with = new With();
099        }
100        return new WithBuilder<>((Q) this, with, name);
101    }
102
103    @SuppressWarnings("unchecked")
104    public <Q extends QueryWrapper> WithBuilder<Q> with(String name, String... params) {
105        if (with == null) {
106            with = new With();
107        }
108        return new WithBuilder<>((Q) this, with, name, Arrays.asList(params));
109    }
110
111    @SuppressWarnings("unchecked")
112    public <Q extends QueryWrapper> WithBuilder<Q> withRecursive(String name) {
113        if (with == null) {
114            with = new With(true);
115        }
116        return new WithBuilder<>((Q) this, with, name);
117    }
118
119    @SuppressWarnings("unchecked")
120    public <Q extends QueryWrapper> WithBuilder<Q> withRecursive(String name, String... params) {
121        if (with == null) {
122            with = new With(true);
123        }
124        return new WithBuilder<>((Q) this, with, name, Arrays.asList(params));
125    }
126
127    public QueryWrapper select() {
128        return this;
129    }
130
131    public QueryWrapper select(String... columns) {
132        for (String column : columns) {
133            addSelectColumn(new RawQueryColumn(column));
134        }
135        return this;
136    }
137
138    public <T> QueryWrapper select(LambdaGetter<T>... lambdaGetters) {
139        for (LambdaGetter<?> lambdaGetter : lambdaGetters) {
140            QueryColumn queryColumn = LambdaUtil.getQueryColumn(lambdaGetter);
141            addSelectColumn(queryColumn);
142        }
143        return this;
144    }
145
146    public QueryWrapper select(QueryColumn... queryColumns) {
147        for (QueryColumn column : queryColumns) {
148            if (column != null) {
149                addSelectColumn(column);
150            }
151        }
152        return this;
153    }
154
155    public QueryWrapper select(Iterable<QueryColumn> queryColumns) {
156        for (QueryColumn column : queryColumns) {
157            if (column != null) {
158                addSelectColumn(column);
159            }
160        }
161        return this;
162    }
163
164    public QueryWrapper select(QueryColumn[]... queryColumns) {
165        for (QueryColumn[] columnArray : queryColumns) {
166            if (columnArray != null) {
167                for (QueryColumn column : columnArray) {
168                    if (column != null) {
169                        addSelectColumn(column);
170                    }
171                }
172            }
173        }
174        return this;
175    }
176
177    public QueryWrapper select(QueryColumn[] queryColumns, QueryColumn... queryColumns2) {
178        for (QueryColumn column : queryColumns) {
179            if (column != null) {
180                addSelectColumn(column);
181            }
182        }
183        for (QueryColumn column : queryColumns2) {
184            if (column != null) {
185                addSelectColumn(column);
186            }
187        }
188        return this;
189    }
190
191    public QueryWrapper from(TableDef... tableDefs) {
192        for (TableDef tableDef : tableDefs) {
193            from(new QueryTable(tableDef));
194        }
195        return this;
196    }
197
198    public QueryWrapper from(Class<?>... entityClasses) {
199        for (Class<?> entityClass : entityClasses) {
200            TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass);
201            from(new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()));
202        }
203        return this;
204    }
205
206    public QueryWrapper from(String... tables) {
207        for (String table : tables) {
208            if (StringUtil.isBlank(table)) {
209                throw new IllegalArgumentException("table must not be null or blank.");
210            }
211            from(new QueryTable(table));
212        }
213        return this;
214    }
215
216    public QueryWrapper from(QueryTable... tables) {
217        if (CollectionUtil.isEmpty(queryTables)) {
218            queryTables = new ArrayList<>();
219            queryTables.addAll(Arrays.asList(tables));
220        } else {
221            for (QueryTable table : tables) {
222                boolean contains = false;
223                for (QueryTable queryTable : queryTables) {
224                    if (queryTable.isSameTable(table)) {
225                        contains = true;
226                    }
227                }
228                if (!contains) {
229                    queryTables.add(table);
230                }
231            }
232        }
233        return this;
234    }
235
236    public QueryWrapper from(QueryWrapper queryWrapper) {
237        return from(new SelectQueryTable(queryWrapper));
238    }
239
240    public QueryWrapper as(String alias) {
241        if (CollectionUtil.isEmpty(queryTables)) {
242            throw new IllegalArgumentException("query table must not be empty.");
243        }
244        queryTables.get(queryTables.size() - 1).alias = alias;
245        return this;
246    }
247
248    public QueryWrapper where(QueryCondition queryCondition) {
249        this.setWhereQueryCondition(queryCondition);
250        return this;
251    }
252
253    public QueryWrapper where(String sql) {
254        this.setWhereQueryCondition(new RawQueryCondition(sql));
255        return this;
256    }
257
258    public QueryWrapper where(String sql, Object... params) {
259        this.setWhereQueryCondition(new RawQueryCondition(sql, params));
260        return this;
261    }
262
263    public QueryWrapper where(Map<String, Object> whereConditions) {
264        return and(whereConditions);
265    }
266
267    public QueryWrapper where(Map<String, Object> whereConditions, SqlOperators operators) {
268        return and(whereConditions, operators);
269    }
270
271    public <T> QueryConditionBuilder<? extends QueryWrapper> where(LambdaGetter<T> fn) {
272        return new QueryConditionBuilder<>(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
273    }
274
275    public QueryWrapper where(Consumer<QueryWrapper> consumer) {
276        return and(consumer);
277    }
278
279    public QueryWrapper and(QueryCondition queryCondition) {
280        return addWhereQueryCondition(queryCondition, SqlConnector.AND);
281    }
282
283    public QueryWrapper and(String sql) {
284        this.addWhereQueryCondition(new RawQueryCondition(sql), SqlConnector.AND);
285        return this;
286    }
287
288    public QueryWrapper and(String sql, Object... params) {
289        this.addWhereQueryCondition(new RawQueryCondition(sql, params), SqlConnector.AND);
290        return this;
291    }
292
293    public <T> QueryConditionBuilder<? extends QueryWrapper> and(LambdaGetter<T> fn) {
294        return new QueryConditionBuilder<>(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
295    }
296
297    public QueryWrapper and(Consumer<QueryWrapper> consumer) {
298        return and(consumer, true);
299    }
300
301    public QueryWrapper and(Consumer<QueryWrapper> consumer, boolean condition) {
302        if (!condition) {
303            return this;
304        }
305        QueryWrapper newWrapper = new QueryWrapper();
306        consumer.accept(newWrapper);
307        QueryCondition whereQueryCondition = newWrapper.whereQueryCondition;
308        if (whereQueryCondition != null) {
309            and(new Brackets(whereQueryCondition));
310        }
311        return this;
312    }
313
314
315    public QueryWrapper and(Map<String, Object> whereConditions) {
316        return and(whereConditions, SqlOperators.empty());
317    }
318
319    public QueryWrapper and(Map<String, Object> whereConditions, SqlOperators operators) {
320        return connectMap(whereConditions, operators, SqlConnector.AND, SqlConnector.AND);
321    }
322
323    public QueryWrapper and(Map<String, Object> whereConditions, SqlOperators operators, SqlConnector innerConnector) {
324        return connectMap(whereConditions, operators, SqlConnector.AND, innerConnector);
325    }
326
327
328    public QueryWrapper or(QueryCondition queryCondition) {
329        return addWhereQueryCondition(queryCondition, SqlConnector.OR);
330    }
331
332    public QueryWrapper or(String sql) {
333        this.addWhereQueryCondition(new RawQueryCondition(sql), SqlConnector.OR);
334        return this;
335    }
336
337    public QueryWrapper or(String sql, Object... params) {
338        this.addWhereQueryCondition(new RawQueryCondition(sql, params), SqlConnector.OR);
339        return this;
340    }
341
342    public <T> QueryConditionBuilder<? extends QueryWrapper> or(LambdaGetter<T> fn) {
343        return new QueryConditionBuilder<>(this, LambdaUtil.getQueryColumn(fn), SqlConnector.OR);
344    }
345
346    public QueryWrapper or(Consumer<QueryWrapper> consumer) {
347        return or(consumer, true);
348    }
349
350    public QueryWrapper or(Consumer<QueryWrapper> consumer, boolean condition) {
351        if (!condition) {
352            return this;
353        }
354        QueryWrapper newWrapper = new QueryWrapper();
355        consumer.accept(newWrapper);
356        QueryCondition whereQueryCondition = newWrapper.whereQueryCondition;
357        if (whereQueryCondition != null) {
358            or(new Brackets(whereQueryCondition));
359        }
360        return this;
361    }
362
363    public QueryWrapper or(Map<String, Object> whereConditions) {
364        return or(whereConditions, SqlOperators.empty());
365    }
366
367    public QueryWrapper or(Map<String, Object> whereConditions, SqlOperators operators) {
368        return connectMap(whereConditions, operators, SqlConnector.OR, SqlConnector.AND);
369    }
370
371    public QueryWrapper or(Map<String, Object> whereConditions, SqlOperators operators, SqlConnector innerConnector) {
372        return connectMap(whereConditions, operators, SqlConnector.OR, SqlConnector.AND);
373    }
374
375    protected QueryWrapper connectMap(Map<String, Object> mapConditions, SqlOperators operators, SqlConnector outerConnector, SqlConnector innerConnector) {
376        if (operators == null) {
377            operators = SqlOperators.empty();
378        }
379        if (mapConditions != null) {
380            QueryCondition condition = null;
381            for (Map.Entry<String, Object> entry : mapConditions.entrySet()) {
382                SqlOperator operator = operators.get(entry.getKey());
383                if (operator == null) {
384                    operator = SqlOperator.EQUALS;
385                }
386                QueryCondition cond = QueryCondition.create(new QueryColumn(entry.getKey()), operator.getValue(), entry.getValue());
387                if (condition == null) {
388                    condition = cond;
389                } else {
390                    if (innerConnector == SqlConnector.AND) {
391                        condition.and(cond);
392                    } else {
393                        condition.or(cond);
394                    }
395                }
396            }
397            addWhereQueryCondition(condition, outerConnector);
398        }
399        return this;
400    }
401
402
403    public <Q extends QueryWrapper> Joiner<Q> leftJoin(String table) {
404        return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
405    }
406
407    public <Q extends QueryWrapper> Joiner<Q> leftJoin(String table, boolean when) {
408        return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
409    }
410
411    public <Q extends QueryWrapper> Joiner<Q> leftJoin(Class<?> entityClass) {
412        return joining(SqlConsts.LEFT_JOIN, entityClass, true);
413    }
414
415    public <Q extends QueryWrapper> Joiner<Q> leftJoin(Class<?> entityClass, boolean when) {
416        return joining(SqlConsts.LEFT_JOIN, entityClass, when);
417    }
418
419    public <Q extends QueryWrapper> Joiner<Q> leftJoin(TableDef table) {
420        return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
421    }
422
423    public <Q extends QueryWrapper> Joiner<Q> leftJoin(TableDef table, boolean when) {
424        return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
425    }
426
427    public <Q extends QueryWrapper> Joiner<Q> leftJoin(QueryWrapper table) {
428        return joining(SqlConsts.LEFT_JOIN, table, true);
429    }
430
431    public <Q extends QueryWrapper> Joiner<Q> leftJoin(QueryWrapper table, boolean when) {
432        return joining(SqlConsts.LEFT_JOIN, table, when);
433    }
434
435    public <Q extends QueryWrapper> Joiner<Q> rightJoin(String table) {
436        return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
437    }
438
439    public <Q extends QueryWrapper> Joiner<Q> rightJoin(String table, boolean when) {
440        return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
441    }
442
443    public <Q extends QueryWrapper> Joiner<Q> rightJoin(Class<?> entityClass) {
444        return joining(SqlConsts.RIGHT_JOIN, entityClass, true);
445    }
446
447    public <Q extends QueryWrapper> Joiner<Q> rightJoin(Class<?> entityClass, boolean when) {
448        return joining(SqlConsts.RIGHT_JOIN, entityClass, when);
449    }
450
451    public <Q extends QueryWrapper> Joiner<Q> rightJoin(TableDef table) {
452        return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
453    }
454
455    public <Q extends QueryWrapper> Joiner<Q> rightJoin(TableDef table, boolean when) {
456        return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
457    }
458
459    public <Q extends QueryWrapper> Joiner<Q> rightJoin(QueryWrapper table) {
460        return joining(SqlConsts.RIGHT_JOIN, table, true);
461    }
462
463    public <Q extends QueryWrapper> Joiner<Q> rightJoin(QueryWrapper table, boolean when) {
464        return joining(SqlConsts.RIGHT_JOIN, table, when);
465    }
466
467    public <Q extends QueryWrapper> Joiner<Q> innerJoin(String table) {
468        return joining(SqlConsts.INNER_JOIN, new QueryTable(table), true);
469    }
470
471    public <Q extends QueryWrapper> Joiner<Q> innerJoin(String table, boolean when) {
472        return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
473    }
474
475    public <Q extends QueryWrapper> Joiner<Q> innerJoin(Class<?> entityClass) {
476        return joining(SqlConsts.INNER_JOIN, entityClass, true);
477    }
478
479    public <Q extends QueryWrapper> Joiner<Q> innerJoin(Class<?> entityClass, boolean when) {
480        return joining(SqlConsts.INNER_JOIN, entityClass, when);
481    }
482
483    public <Q extends QueryWrapper> Joiner<Q> innerJoin(TableDef table) {
484        return innerJoin(table, true);
485    }
486
487    public <Q extends QueryWrapper> Joiner<Q> innerJoin(TableDef table, boolean when) {
488        return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
489    }
490
491    public <Q extends QueryWrapper> Joiner<Q> innerJoin(QueryWrapper table) {
492        return joining(SqlConsts.INNER_JOIN, table, true);
493    }
494
495    public <Q extends QueryWrapper> Joiner<Q> innerJoin(QueryWrapper table, boolean when) {
496        return joining(SqlConsts.INNER_JOIN, table, when);
497    }
498
499    public <Q extends QueryWrapper> Joiner<Q> fullJoin(String table) {
500        return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
501    }
502
503    public <Q extends QueryWrapper> Joiner<Q> fullJoin(String table, boolean when) {
504        return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
505    }
506
507    public <Q extends QueryWrapper> Joiner<Q> fullJoin(Class<?> entityClass) {
508        return joining(SqlConsts.FULL_JOIN, entityClass, true);
509    }
510
511    public <Q extends QueryWrapper> Joiner<Q> fullJoin(Class<?> entityClass, boolean when) {
512        return joining(SqlConsts.FULL_JOIN, entityClass, when);
513    }
514
515    public <Q extends QueryWrapper> Joiner<Q> fullJoin(TableDef table) {
516        return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
517    }
518
519    public <Q extends QueryWrapper> Joiner<Q> fullJoin(TableDef table, boolean when) {
520        return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
521    }
522
523    public <Q extends QueryWrapper> Joiner<Q> fullJoin(QueryWrapper table) {
524        return joining(SqlConsts.FULL_JOIN, table, true);
525    }
526
527    public <Q extends QueryWrapper> Joiner<Q> fullJoin(QueryWrapper table, boolean when) {
528        return joining(SqlConsts.FULL_JOIN, table, when);
529    }
530
531    public <Q extends QueryWrapper> Joiner<Q> crossJoin(String table) {
532        return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
533    }
534
535    public <Q extends QueryWrapper> Joiner<Q> crossJoin(String table, boolean when) {
536        return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
537    }
538
539    public <Q extends QueryWrapper> Joiner<Q> crossJoin(Class<?> entityClass) {
540        return joining(SqlConsts.CROSS_JOIN, entityClass, true);
541    }
542
543    public <Q extends QueryWrapper> Joiner<Q> crossJoin(Class<?> entityClass, boolean when) {
544        return joining(SqlConsts.CROSS_JOIN, entityClass, when);
545    }
546
547    public <Q extends QueryWrapper> Joiner<Q> crossJoin(TableDef table) {
548        return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
549    }
550
551    public <Q extends QueryWrapper> Joiner<Q> crossJoin(TableDef table, boolean when) {
552        return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
553    }
554
555    public <Q extends QueryWrapper> Joiner<Q> crossJoin(QueryWrapper table) {
556        return joining(SqlConsts.CROSS_JOIN, table, true);
557    }
558
559    public <Q extends QueryWrapper> Joiner<Q> crossJoin(QueryWrapper table, boolean when) {
560        return joining(SqlConsts.CROSS_JOIN, table, when);
561    }
562
563    public <Q extends QueryWrapper> Joiner<Q> join(String table) {
564        return joining(SqlConsts.JOIN, new QueryTable(table), true);
565    }
566
567    public <Q extends QueryWrapper> Joiner<Q> join(String table, boolean when) {
568        return joining(SqlConsts.JOIN, new QueryTable(table), when);
569    }
570
571    public <Q extends QueryWrapper> Joiner<Q> join(Class<?> entityClass) {
572        return joining(SqlConsts.JOIN, entityClass, true);
573    }
574
575    public <Q extends QueryWrapper> Joiner<Q> join(Class<?> entityClass, boolean when) {
576        return joining(SqlConsts.JOIN, entityClass, when);
577    }
578
579    public <Q extends QueryWrapper> Joiner<Q> join(TableDef table) {
580        return joining(SqlConsts.JOIN, new QueryTable(table), true);
581    }
582
583    public <Q extends QueryWrapper> Joiner<Q> join(TableDef table, boolean when) {
584        return joining(SqlConsts.JOIN, new QueryTable(table), when);
585    }
586
587    public <Q extends QueryWrapper> Joiner<Q> join(QueryWrapper table) {
588        return joining(SqlConsts.JOIN, table, true);
589    }
590
591    public <Q extends QueryWrapper> Joiner<Q> join(QueryWrapper table, boolean when) {
592        return joining(SqlConsts.JOIN, table, when);
593    }
594
595    public QueryWrapper union(QueryWrapper unionQuery) {
596        if (unions == null) {
597            unions = new ArrayList<>();
598        }
599        unions.add(UnionWrapper.union(unionQuery));
600        return this;
601    }
602
603    public QueryWrapper unionAll(QueryWrapper unionQuery) {
604        if (unions == null) {
605            unions = new ArrayList<>();
606        }
607        unions.add(UnionWrapper.unionAll(unionQuery));
608        return this;
609    }
610
611    public QueryWrapper forUpdate() {
612        addEndFragment("FOR UPDATE");
613        return this;
614    }
615
616    public QueryWrapper forUpdateNoWait() {
617        addEndFragment("FOR UPDATE NOWAIT");
618        return this;
619    }
620
621    //    public QueryWrapper end(String sqlPart){
622    //        addEndFragment(sqlPart);
623    //        return this;
624    //    }
625
626    @SuppressWarnings("unchecked")
627    protected <T extends QueryWrapper> Joiner<T> joining(String type, QueryTable table, boolean when) {
628        Join join = new Join(type, table, when);
629        addJoinTable(join.getQueryTable());
630        return new Joiner<>((T) addJoin(join), join);
631    }
632
633    protected <T extends QueryWrapper> Joiner<T> joining(String type, Class<?> entityClass, boolean when) {
634        TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass);
635        QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName());
636        return joining(type, queryTable, when);
637    }
638
639    @SuppressWarnings("unchecked")
640    protected <T extends QueryWrapper> Joiner<T> joining(String type, QueryWrapper queryWrapper, boolean when) {
641        Join join = new Join(type, queryWrapper, when);
642        addJoinTable(join.getQueryTable());
643        return new Joiner<>((T) addJoin(join), join);
644    }
645
646    public QueryWrapper groupBy(String name) {
647        addGroupByColumns(new RawQueryColumn(name));
648        return this;
649    }
650
651    public QueryWrapper groupBy(String... names) {
652        for (String name : names) {
653            groupBy(name);
654        }
655        return this;
656    }
657
658    public QueryWrapper groupBy(QueryColumn column) {
659        addGroupByColumns(column);
660        return this;
661    }
662
663    public QueryWrapper groupBy(QueryColumn... columns) {
664        for (QueryColumn column : columns) {
665            groupBy(column);
666        }
667        return this;
668    }
669
670    public <T> QueryWrapper groupBy(LambdaGetter<T> column) {
671        addGroupByColumns(LambdaUtil.getQueryColumn(column));
672        return this;
673    }
674    public <T> QueryWrapper groupBy(LambdaGetter<T>... columns) {
675        for (LambdaGetter<T> column : columns) {
676            groupBy(LambdaUtil.getQueryColumn(column));
677        }
678        return this;
679    }
680
681    public QueryWrapper having(QueryCondition queryCondition) {
682        addHavingQueryCondition(queryCondition, SqlConnector.AND);
683        return this;
684    }
685
686    /**
687     * <p>动态排序。
688     *
689     * <p>排序规则:
690     * <ul>
691     *     <li>{@code null} 不排序
692     *     <li>{@code true} 升序
693     *     <li>{@code false} 降序
694     * </ul>
695     *
696     * @param column 列
697     * @param asc    是否升序
698     * @return {@link QueryWrapper}
699     */
700    public QueryWrapper orderBy(QueryColumn column, Boolean asc) {
701        if (asc != null) {
702            if (asc) {
703                addOrderBy(column.asc());
704            } else {
705                addOrderBy(column.desc());
706            }
707        }
708        return this;
709    }
710
711    public QueryWrapper orderBy(QueryOrderBy... orderBys) {
712        for (QueryOrderBy queryOrderBy : orderBys) {
713            addOrderBy(queryOrderBy);
714        }
715        return this;
716    }
717
718    /**
719     * <p>动态排序。
720     *
721     * <p>排序规则:
722     * <ul>
723     *     <li>{@code null} 不排序
724     *     <li>{@code true} 升序
725     *     <li>{@code false} 降序
726     * </ul>
727     *
728     * @param column 列
729     * @param asc    是否升序
730     * @return {@link QueryWrapper}
731     */
732    public <T> QueryWrapper orderBy(LambdaGetter<T> column, Boolean asc) {
733        if (asc != null) {
734            if (asc) {
735                addOrderBy(LambdaUtil.getQueryColumn(column).asc());
736            } else {
737                addOrderBy(LambdaUtil.getQueryColumn(column).desc());
738            }
739        }
740        return this;
741    }
742
743
744    public <T> QueryOrderByBuilder<? extends QueryWrapper> orderBy(LambdaGetter<T> getter) {
745        return new QueryOrderByBuilder<>(this, getter);
746    }
747
748    /**
749     * <p>动态排序。
750     *
751     * <p>排序规则:
752     * <ul>
753     *     <li>{@code null} 不排序
754     *     <li>{@code true} 升序
755     *     <li>{@code false} 降序
756     * </ul>
757     *
758     * @param column 列
759     * @param asc    是否升序
760     * @return {@link QueryWrapper}
761     */
762    public QueryWrapper orderBy(String column, Boolean asc) {
763        if (asc != null) {
764            if (asc) {
765                addOrderBy(new RawQueryColumn(column).asc());
766            } else {
767                addOrderBy(new RawQueryColumn(column).desc());
768            }
769        }
770        return this;
771    }
772
773    public QueryWrapper orderBy(String... orderBys) {
774        if (orderBys == null || orderBys.length == 0) {
775            //ignore
776            return this;
777        }
778        for (String queryOrderBy : orderBys) {
779            if (StringUtil.isNotBlank(queryOrderBy)) {
780                addOrderBy(new RawQueryOrderBy(queryOrderBy));
781            }
782        }
783        return this;
784    }
785
786    public QueryWrapper limit(Number rows) {
787        if (rows != null) {
788            setLimitRows(rows.longValue());
789        } else {
790            setLimitRows(null);
791        }
792        return this;
793    }
794
795    public QueryWrapper offset(Number offset) {
796        if (offset != null) {
797            setLimitOffset(offset.longValue());
798        } else {
799            setLimitOffset(null);
800        }
801        return this;
802    }
803
804    public QueryWrapper limit(Number offset, Number rows) {
805        offset(offset);
806        limit(rows);
807        return this;
808    }
809
810    public QueryWrapper datasource(String datasource) {
811        setDataSource(datasource);
812        return this;
813    }
814
815    public QueryWrapper hint(String hint) {
816        setHint(hint);
817        return this;
818    }
819
820
821    /////////MyBatis-Plus 兼容方法///////////////
822
823    /**
824     * 等于 {@code =}
825     *
826     * @param column 列名
827     * @param value  条件的值
828     */
829    public QueryWrapper eq(String column, Object value) {
830        and(QueryMethods.column(column).eq(value));
831        return this;
832    }
833
834    /**
835     * 等于 {@code =}
836     *
837     * @param column 列名, lambda 展示
838     * @param value  值
839     */
840    public <T> QueryWrapper eq(LambdaGetter<T> column, Object value) {
841        and(QueryMethods.column(column).eq(value));
842        return this;
843    }
844
845    /**
846     * 等于 {@code =}
847     *
848     * @param column      列名
849     * @param value       条件的值
850     * @param isEffective 是否有效
851     */
852    public QueryWrapper eq(String column, Object value, boolean isEffective) {
853        and(QueryMethods.column(column).eq(value).when(isEffective));
854        return this;
855    }
856
857    /**
858     * 等于 {@code =}
859     *
860     * @param column      列名, lambda 展示
861     * @param value       值
862     * @param isEffective 是否有效
863     */
864    public <T> QueryWrapper eq(LambdaGetter<T> column, Object value, boolean isEffective) {
865        and(QueryMethods.column(column).eq(value).when(isEffective));
866        return this;
867    }
868
869    /**
870     * 等于 {@code =}
871     *
872     * @param column      列名
873     * @param value       条件的值
874     * @param isEffective 是否有效
875     */
876    public <V> QueryWrapper eq(String column, V value, Predicate<V> isEffective) {
877        and(QueryMethods.column(column).eq(value, isEffective));
878        return this;
879    }
880
881    /**
882     * 等于 {@code =}
883     *
884     * @param column      列名, lambda 展示
885     * @param value       值
886     * @param isEffective 是否有效
887     */
888    public <T, V> QueryWrapper eq(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
889        and(QueryMethods.column(column).eq(value, isEffective));
890        return this;
891    }
892
893
894    /**
895     * 不等于 {@code !=}
896     *
897     * @param column 列名
898     * @param value  条件的值
899     */
900    public QueryWrapper ne(String column, Object value) {
901        and(QueryMethods.column(column).ne(value));
902        return this;
903    }
904
905    /**
906     * 不等于 {@code !=}
907     *
908     * @param column 列名, lambda 展示
909     * @param value  值
910     */
911    public <T> QueryWrapper ne(LambdaGetter<T> column, Object value) {
912        and(QueryMethods.column(column).ne(value));
913        return this;
914    }
915
916    /**
917     * 不等于 {@code !=}
918     *
919     * @param column      列名
920     * @param value       条件的值
921     * @param isEffective 是否有效
922     */
923    public QueryWrapper ne(String column, Object value, boolean isEffective) {
924        and(QueryMethods.column(column).ne(value).when(isEffective));
925        return this;
926    }
927
928    /**
929     * 不等于 {@code !=}
930     *
931     * @param column      列名, lambda 展示
932     * @param value       值
933     * @param isEffective 是否有效
934     */
935    public <T> QueryWrapper ne(LambdaGetter<T> column, Object value, boolean isEffective) {
936        and(QueryMethods.column(column).ne(value).when(isEffective));
937        return this;
938    }
939
940    /**
941     * 不等于 {@code !=}
942     *
943     * @param column      列名
944     * @param value       条件的值
945     * @param isEffective 是否有效
946     */
947    public <V> QueryWrapper ne(String column, V value, Predicate<V> isEffective) {
948        and(QueryMethods.column(column).ne(value, isEffective));
949        return this;
950    }
951
952    /**
953     * 不等于 {@code !=}
954     *
955     * @param column      列名, lambda 展示
956     * @param value       值
957     * @param isEffective 是否有效
958     */
959    public <T, V> QueryWrapper ne(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
960        and(QueryMethods.column(column).ne(value, isEffective));
961        return this;
962    }
963
964
965    /**
966     * 大于 {@code >}
967     *
968     * @param column 列名
969     * @param value  条件的值
970     */
971    public QueryWrapper gt(String column, Object value) {
972        and(QueryMethods.column(column).gt(value));
973        return this;
974    }
975
976    /**
977     * 大于 {@code >}
978     *
979     * @param column 列名, lambda 展示
980     * @param value  值
981     */
982    public <T> QueryWrapper gt(LambdaGetter<T> column, Object value) {
983        and(QueryMethods.column(column).gt(value));
984        return this;
985    }
986
987    /**
988     * 大于 {@code >}
989     *
990     * @param column      列名
991     * @param value       条件的值
992     * @param isEffective 是否有效
993     */
994    public QueryWrapper gt(String column, Object value, boolean isEffective) {
995        and(QueryMethods.column(column).gt(value).when(isEffective));
996        return this;
997    }
998
999    /**
1000     * 大于 {@code >}
1001     *
1002     * @param column      列名, lambda 展示
1003     * @param value       值
1004     * @param isEffective 是否有效
1005     */
1006    public <T> QueryWrapper gt(LambdaGetter<T> column, Object value, boolean isEffective) {
1007        and(QueryMethods.column(column).gt(value).when(isEffective));
1008        return this;
1009    }
1010
1011    /**
1012     * 大于 {@code >}
1013     *
1014     * @param column      列名
1015     * @param value       条件的值
1016     * @param isEffective 是否有效
1017     */
1018    public <V> QueryWrapper gt(String column, V value, Predicate<V> isEffective) {
1019        and(QueryMethods.column(column).gt(value, isEffective));
1020        return this;
1021    }
1022
1023    /**
1024     * 大于 {@code >}
1025     *
1026     * @param column      列名, lambda 展示
1027     * @param value       值
1028     * @param isEffective 是否有效
1029     */
1030    public <T, V> QueryWrapper gt(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1031        and(QueryMethods.column(column).gt(value, isEffective));
1032        return this;
1033    }
1034
1035
1036    /**
1037     * 大于等于 {@code >=}
1038     *
1039     * @param column 列名
1040     * @param value  条件的值
1041     */
1042    public QueryWrapper ge(String column, Object value) {
1043        and(QueryMethods.column(column).ge(value));
1044        return this;
1045    }
1046
1047    /**
1048     * 大于等于 {@code >=}
1049     *
1050     * @param column 列名, lambda 展示
1051     * @param value  值
1052     */
1053    public <T> QueryWrapper ge(LambdaGetter<T> column, Object value) {
1054        and(QueryMethods.column(column).ge(value));
1055        return this;
1056    }
1057
1058    /**
1059     * 大于等于 {@code >=}
1060     *
1061     * @param column      列名
1062     * @param value       条件的值
1063     * @param isEffective 是否有效
1064     */
1065    public QueryWrapper ge(String column, Object value, boolean isEffective) {
1066        and(QueryMethods.column(column).ge(value).when(isEffective));
1067        return this;
1068    }
1069
1070    /**
1071     * 大于等于 {@code >=}
1072     *
1073     * @param column      列名, lambda 展示
1074     * @param value       值
1075     * @param isEffective 是否有效
1076     */
1077    public <T> QueryWrapper ge(LambdaGetter<T> column, Object value, boolean isEffective) {
1078        and(QueryMethods.column(column).ge(value).when(isEffective));
1079        return this;
1080    }
1081
1082    /**
1083     * 大于等于 {@code >=}
1084     *
1085     * @param column      列名
1086     * @param value       条件的值
1087     * @param isEffective 是否有效
1088     */
1089    public <V> QueryWrapper ge(String column, V value, Predicate<V> isEffective) {
1090        and(QueryMethods.column(column).ge(value, isEffective));
1091        return this;
1092    }
1093
1094    /**
1095     * 大于等于 {@code >=}
1096     *
1097     * @param column      列名, lambda 展示
1098     * @param value       值
1099     * @param isEffective 是否有效
1100     */
1101    public <T, V> QueryWrapper ge(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1102        and(QueryMethods.column(column).ge(value, isEffective));
1103        return this;
1104    }
1105
1106
1107    /**
1108     * 小于 {@code <}
1109     *
1110     * @param column 列名
1111     * @param value  条件的值
1112     */
1113    public QueryWrapper lt(String column, Object value) {
1114        and(QueryMethods.column(column).lt(value));
1115        return this;
1116    }
1117
1118    /**
1119     * 小于 {@code <}
1120     *
1121     * @param column 列名, lambda 展示
1122     * @param value  值
1123     */
1124    public <T> QueryWrapper lt(LambdaGetter<T> column, Object value) {
1125        and(QueryMethods.column(column).lt(value));
1126        return this;
1127    }
1128
1129    /**
1130     * 小于 {@code <}
1131     *
1132     * @param column      列名
1133     * @param value       条件的值
1134     * @param isEffective 是否有效
1135     */
1136    public QueryWrapper lt(String column, Object value, boolean isEffective) {
1137        and(QueryMethods.column(column).lt(value).when(isEffective));
1138        return this;
1139    }
1140
1141    /**
1142     * 小于 {@code <}
1143     *
1144     * @param column      列名, lambda 展示
1145     * @param value       值
1146     * @param isEffective 是否有效
1147     */
1148    public <T> QueryWrapper lt(LambdaGetter<T> column, Object value, boolean isEffective) {
1149        and(QueryMethods.column(column).lt(value).when(isEffective));
1150        return this;
1151    }
1152
1153    /**
1154     * 小于 {@code <}
1155     *
1156     * @param column      列名
1157     * @param value       条件的值
1158     * @param isEffective 是否有效
1159     */
1160    public <V> QueryWrapper lt(String column, V value, Predicate<V> isEffective) {
1161        and(QueryMethods.column(column).lt(value, isEffective));
1162        return this;
1163    }
1164
1165    /**
1166     * 小于 {@code <}
1167     *
1168     * @param column      列名, lambda 展示
1169     * @param value       值
1170     * @param isEffective 是否有效
1171     */
1172    public <T, V> QueryWrapper lt(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1173        and(QueryMethods.column(column).lt(value, isEffective));
1174        return this;
1175    }
1176
1177
1178    /**
1179     * 小于等于 {@code <=}
1180     *
1181     * @param column 列名
1182     * @param value  条件的值
1183     */
1184    public QueryWrapper le(String column, Object value) {
1185        and(QueryMethods.column(column).le(value));
1186        return this;
1187    }
1188
1189    /**
1190     * 小于等于 {@code <=}
1191     *
1192     * @param column 列名, lambda 展示
1193     * @param value  值
1194     */
1195    public <T> QueryWrapper le(LambdaGetter<T> column, Object value) {
1196        and(QueryMethods.column(column).le(value));
1197        return this;
1198    }
1199
1200    /**
1201     * 小于等于 {@code <=}
1202     *
1203     * @param column      列名
1204     * @param value       条件的值
1205     * @param isEffective 是否有效
1206     */
1207    public QueryWrapper le(String column, Object value, boolean isEffective) {
1208        and(QueryMethods.column(column).le(value).when(isEffective));
1209        return this;
1210    }
1211
1212    /**
1213     * 小于等于 {@code <=}
1214     *
1215     * @param column      列名, lambda 展示
1216     * @param value       值
1217     * @param isEffective 是否有效
1218     */
1219    public <T> QueryWrapper le(LambdaGetter<T> column, Object value, boolean isEffective) {
1220        and(QueryMethods.column(column).le(value).when(isEffective));
1221        return this;
1222    }
1223
1224    /**
1225     * 小于等于 {@code <=}
1226     *
1227     * @param column      列名
1228     * @param value       条件的值
1229     * @param isEffective 是否有效
1230     */
1231    public <V> QueryWrapper le(String column, V value, Predicate<V> isEffective) {
1232        and(QueryMethods.column(column).le(value, isEffective));
1233        return this;
1234    }
1235
1236    /**
1237     * 小于等于 {@code <=}
1238     *
1239     * @param column      列名, lambda 展示
1240     * @param value       值
1241     * @param isEffective 是否有效
1242     */
1243    public <T, V> QueryWrapper le(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1244        and(QueryMethods.column(column).le(value, isEffective));
1245        return this;
1246    }
1247
1248
1249    /**
1250     * {@code IN(value)}
1251     *
1252     * @param column 列名
1253     * @param values 条件的值
1254     */
1255    public QueryWrapper in(String column, Object... values) {
1256        and(QueryMethods.column(column).in(values));
1257        return this;
1258    }
1259
1260    /**
1261     * {@code IN(value)}
1262     *
1263     * @param column 列名, lambda 展示
1264     * @param values 值
1265     */
1266    public <T> QueryWrapper in(LambdaGetter<T> column, Object... values) {
1267        and(QueryMethods.column(column).in(values));
1268        return this;
1269    }
1270
1271
1272    /**
1273     * {@code IN(value)}
1274     *
1275     * @param column       列名
1276     * @param queryWrapper 条件的值
1277     */
1278    public QueryWrapper in(String column, QueryWrapper queryWrapper) {
1279        and(QueryMethods.column(column).in(queryWrapper));
1280        return this;
1281    }
1282
1283
1284    /**
1285     * {@code IN(value)}
1286     *
1287     * @param column       列名, lambda 展示
1288     * @param queryWrapper 值
1289     */
1290    public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper) {
1291        and(QueryMethods.column(column).in(queryWrapper));
1292        return this;
1293    }
1294
1295
1296    /**
1297     * {@code IN(value)}
1298     *
1299     * @param column 列名
1300     * @param values 条件的值
1301     */
1302    public QueryWrapper in(String column, Collection<?> values) {
1303        and(QueryMethods.column(column).in(values));
1304        return this;
1305    }
1306
1307    /**
1308     * {@code IN(value)}
1309     *
1310     * @param column 列名, lambda 展示
1311     * @param values 值
1312     */
1313    public <T> QueryWrapper in(LambdaGetter<T> column, Collection<?> values) {
1314        and(QueryMethods.column(column).in(values));
1315        return this;
1316    }
1317
1318
1319    /**
1320     * {@code IN(value)}
1321     *
1322     * @param column 列名
1323     * @param values 条件的值
1324     */
1325    public QueryWrapper in(String column, Object[] values, boolean isEffective) {
1326        and(QueryMethods.column(column).in(values, isEffective));
1327        return this;
1328    }
1329
1330    /**
1331     * {@code IN(value)}
1332     *
1333     * @param column 列名, lambda 展示
1334     * @param values 值
1335     */
1336    public <T> QueryWrapper in(LambdaGetter<T> column, Object[] values, boolean isEffective) {
1337        and(QueryMethods.column(column).in(values, isEffective));
1338        return this;
1339    }
1340
1341
1342    /**
1343     * {@code IN(value)}
1344     *
1345     * @param column 列名
1346     * @param values 条件的值
1347     */
1348    public QueryWrapper in(String column, Collection<?> values, boolean isEffective) {
1349        and(QueryMethods.column(column).in(values, isEffective));
1350        return this;
1351    }
1352
1353    /**
1354     * {@code IN(value)}
1355     *
1356     * @param column 列名, lambda 展示
1357     * @param values 值
1358     */
1359    public <T> QueryWrapper in(LambdaGetter<T> column, Collection<?> values, boolean isEffective) {
1360        and(QueryMethods.column(column).in(values, isEffective));
1361        return this;
1362    }
1363
1364
1365    /**
1366     * {@code IN(value)}
1367     *
1368     * @param column       列名
1369     * @param queryWrapper 条件的值
1370     */
1371    public QueryWrapper in(String column, QueryWrapper queryWrapper, boolean isEffective) {
1372        and(QueryMethods.column(column).in(queryWrapper, isEffective));
1373        return this;
1374    }
1375
1376
1377    /**
1378     * {@code IN(value)}
1379     *
1380     * @param column       列名, lambda 展示
1381     * @param queryWrapper 值
1382     */
1383    public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper, boolean isEffective) {
1384        and(QueryMethods.column(column).in(queryWrapper, isEffective));
1385        return this;
1386    }
1387
1388
1389    /**
1390     * {@code IN(value)}
1391     *
1392     * @param column       列名
1393     * @param queryWrapper 条件的值
1394     */
1395    public QueryWrapper in(String column, QueryWrapper queryWrapper, BooleanSupplier isEffective) {
1396        and(QueryMethods.column(column).in(queryWrapper, isEffective));
1397        return this;
1398    }
1399
1400
1401    /**
1402     * {@code IN(value)}
1403     *
1404     * @param column       列名, lambda 展示
1405     * @param queryWrapper 值
1406     */
1407    public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper, BooleanSupplier isEffective) {
1408        and(QueryMethods.column(column).in(queryWrapper, isEffective));
1409        return this;
1410    }
1411
1412
1413    /**
1414     * {@code NOT IN(value)}
1415     *
1416     * @param column 列名
1417     * @param values 条件的值
1418     */
1419    public QueryWrapper notIn(String column, Object... values) {
1420        and(QueryMethods.column(column).notIn(values));
1421        return this;
1422    }
1423
1424    /**
1425     * {@code NOT IN(value)}
1426     *
1427     * @param column 列名, lambda 展示
1428     * @param values 值
1429     */
1430    public <T> QueryWrapper notIn(LambdaGetter<T> column, Object... values) {
1431        and(QueryMethods.column(column).notIn(values));
1432        return this;
1433    }
1434
1435
1436    /**
1437     * {@code NOT IN(value)}
1438     *
1439     * @param column       列名
1440     * @param queryWrapper 条件的值
1441     */
1442    public QueryWrapper notIn(String column, QueryWrapper queryWrapper) {
1443        and(QueryMethods.column(column).notIn(queryWrapper));
1444        return this;
1445    }
1446
1447
1448    /**
1449     * {@code NOT IN(value)}
1450     *
1451     * @param column       列名, lambda 展示
1452     * @param queryWrapper 值
1453     */
1454    public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper) {
1455        and(QueryMethods.column(column).notIn(queryWrapper));
1456        return this;
1457    }
1458
1459
1460    /**
1461     * {@code NOT IN(value)}
1462     *
1463     * @param column 列名
1464     * @param values 条件的值
1465     */
1466    public QueryWrapper notIn(String column, Collection<?> values) {
1467        and(QueryMethods.column(column).notIn(values));
1468        return this;
1469    }
1470
1471    /**
1472     * {@code NOT IN(value)}
1473     *
1474     * @param column 列名, lambda 展示
1475     * @param values 值
1476     */
1477    public <T> QueryWrapper notIn(LambdaGetter<T> column, Collection<?> values) {
1478        and(QueryMethods.column(column).notIn(values));
1479        return this;
1480    }
1481
1482
1483    /**
1484     * {@code NOT IN(value)}
1485     *
1486     * @param column 列名
1487     * @param values 条件的值
1488     */
1489    public QueryWrapper notIn(String column, Object[] values, boolean isEffective) {
1490        and(QueryMethods.column(column).notIn(values, isEffective));
1491        return this;
1492    }
1493
1494    /**
1495     * {@code NOT IN(value)}
1496     *
1497     * @param column 列名, lambda 展示
1498     * @param values 值
1499     */
1500    public <T> QueryWrapper notIn(LambdaGetter<T> column, Object[] values, boolean isEffective) {
1501        and(QueryMethods.column(column).notIn(values, isEffective));
1502        return this;
1503    }
1504
1505
1506    /**
1507     * {@code NOT IN(value)}
1508     *
1509     * @param column 列名
1510     * @param values 条件的值
1511     */
1512    public QueryWrapper notIn(String column, Collection<?> values, boolean isEffective) {
1513        and(QueryMethods.column(column).notIn(values, isEffective));
1514        return this;
1515    }
1516
1517    /**
1518     * {@code NOT IN(value)}
1519     *
1520     * @param column 列名, lambda 展示
1521     * @param values 值
1522     */
1523    public <T> QueryWrapper notIn(LambdaGetter<T> column, Collection<?> values, boolean isEffective) {
1524        and(QueryMethods.column(column).notIn(values, isEffective));
1525        return this;
1526    }
1527
1528
1529    /**
1530     * {@code NOT IN(value)}
1531     *
1532     * @param column       列名
1533     * @param queryWrapper 条件的值
1534     */
1535    public QueryWrapper notIn(String column, QueryWrapper queryWrapper, boolean isEffective) {
1536        and(QueryMethods.column(column).notIn(queryWrapper, isEffective));
1537        return this;
1538    }
1539
1540
1541    /**
1542     * {@code NOT IN(value)}
1543     *
1544     * @param column       列名, lambda 展示
1545     * @param queryWrapper 值
1546     */
1547    public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper, boolean isEffective) {
1548        and(QueryMethods.column(column).notIn(queryWrapper, isEffective));
1549        return this;
1550    }
1551
1552
1553    /**
1554     * {@code NOT IN(value)}
1555     *
1556     * @param column       列名
1557     * @param queryWrapper 条件的值
1558     */
1559    public QueryWrapper notIn(String column, QueryWrapper queryWrapper, BooleanSupplier isEffective) {
1560        and(QueryMethods.column(column).notIn(queryWrapper, isEffective));
1561        return this;
1562    }
1563
1564
1565    /**
1566     * {@code NOT IN(value)}
1567     *
1568     * @param column       列名, lambda 展示
1569     * @param queryWrapper 值
1570     */
1571    public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper, BooleanSupplier isEffective) {
1572        and(QueryMethods.column(column).notIn(queryWrapper, isEffective));
1573        return this;
1574    }
1575
1576
1577    /**
1578     * {@code BETWEEN start AND end}
1579     *
1580     * @param column 列名
1581     * @param start  开始的值
1582     * @param end    结束的值
1583     */
1584    public QueryWrapper between(String column, Object start, Object end) {
1585        and(QueryMethods.column(column).between(start, end));
1586        return this;
1587    }
1588
1589    /**
1590     * {@code BETWEEN start AND end}
1591     *
1592     * @param column 列名
1593     * @param start  开始的值
1594     * @param end    结束的值
1595     */
1596    public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end) {
1597        and(QueryMethods.column(column).between(start, end));
1598        return this;
1599    }
1600
1601    /**
1602     * {@code BETWEEN start AND end}
1603     *
1604     * @param column 列名
1605     * @param start  开始的值
1606     * @param end    结束的值
1607     */
1608    public QueryWrapper between(String column, Object start, Object end, boolean isEffective) {
1609        and(QueryMethods.column(column).between(start, end, isEffective));
1610        return this;
1611    }
1612
1613    /**
1614     * {@code BETWEEN start AND end}
1615     *
1616     * @param column 列名
1617     * @param start  开始的值
1618     * @param end    结束的值
1619     */
1620    public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end, boolean isEffective) {
1621        and(QueryMethods.column(column).between(start, end, isEffective));
1622        return this;
1623    }
1624
1625
1626    /**
1627     * {@code BETWEEN start AND end}
1628     *
1629     * @param column 列名
1630     * @param start  开始的值
1631     * @param end    结束的值
1632     */
1633    public QueryWrapper between(String column, Object start, Object end, BooleanSupplier isEffective) {
1634        and(QueryMethods.column(column).between(start, end, isEffective));
1635        return this;
1636    }
1637
1638    /**
1639     * {@code BETWEEN start AND end}
1640     *
1641     * @param column 列名
1642     * @param start  开始的值
1643     * @param end    结束的值
1644     */
1645    public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end, BooleanSupplier isEffective) {
1646        and(QueryMethods.column(column).between(start, end, isEffective));
1647        return this;
1648    }
1649
1650
1651    /**
1652     * {@code NOT BETWEEN start AND end}
1653     *
1654     * @param column 列名
1655     * @param start  开始的值
1656     * @param end    结束的值
1657     */
1658    public QueryWrapper notBetween(String column, Object start, Object end) {
1659        and(QueryMethods.column(column).notBetween(start, end));
1660        return this;
1661    }
1662
1663    /**
1664     * {@code NOT BETWEEN start AND end}
1665     *
1666     * @param column 列名
1667     * @param start  开始的值
1668     * @param end    结束的值
1669     */
1670    public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end) {
1671        and(QueryMethods.column(column).notBetween(start, end));
1672        return this;
1673    }
1674
1675    /**
1676     * {@code NOT BETWEEN start AND end}
1677     *
1678     * @param column 列名
1679     * @param start  开始的值
1680     * @param end    结束的值
1681     */
1682    public QueryWrapper notBetween(String column, Object start, Object end, boolean isEffective) {
1683        and(QueryMethods.column(column).notBetween(start, end, isEffective));
1684        return this;
1685    }
1686
1687    /**
1688     * {@code NOT BETWEEN start AND end}
1689     *
1690     * @param column 列名
1691     * @param start  开始的值
1692     * @param end    结束的值
1693     */
1694    public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end, boolean isEffective) {
1695        and(QueryMethods.column(column).notBetween(start, end, isEffective));
1696        return this;
1697    }
1698
1699
1700    /**
1701     * {@code NOT BETWEEN start AND end}
1702     *
1703     * @param column 列名
1704     * @param start  开始的值
1705     * @param end    结束的值
1706     */
1707    public QueryWrapper notBetween(String column, Object start, Object end, BooleanSupplier isEffective) {
1708        and(QueryMethods.column(column).notBetween(start, end, isEffective));
1709        return this;
1710    }
1711
1712    /**
1713     * {@code NOT BETWEEN start AND end}
1714     *
1715     * @param column 列名
1716     * @param start  开始的值
1717     * @param end    结束的值
1718     */
1719    public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end, BooleanSupplier isEffective) {
1720        and(QueryMethods.column(column).notBetween(start, end, isEffective));
1721        return this;
1722    }
1723
1724
1725    /**
1726     * {@code LIKE %value%}
1727     *
1728     * @param column 列名
1729     * @param value  条件的值
1730     */
1731    public QueryWrapper like(String column, Object value) {
1732        and(QueryMethods.column(column).like(value));
1733        return this;
1734    }
1735
1736    /**
1737     * {@code LIKE %value%}
1738     *
1739     * @param column 列名, lambda 展示
1740     * @param value  值
1741     */
1742    public <T> QueryWrapper like(LambdaGetter<T> column, Object value) {
1743        and(QueryMethods.column(column).like(value));
1744        return this;
1745    }
1746
1747    /**
1748     * {@code LIKE %value%}
1749     *
1750     * @param column      列名
1751     * @param value       条件的值
1752     * @param isEffective 是否有效
1753     */
1754    public QueryWrapper like(String column, Object value, boolean isEffective) {
1755        and(QueryMethods.column(column).like(value).when(isEffective));
1756        return this;
1757    }
1758
1759    /**
1760     * {@code LIKE %value%}
1761     *
1762     * @param column      列名, lambda 展示
1763     * @param value       值
1764     * @param isEffective 是否有效
1765     */
1766    public <T> QueryWrapper like(LambdaGetter<T> column, Object value, boolean isEffective) {
1767        and(QueryMethods.column(column).like(value).when(isEffective));
1768        return this;
1769    }
1770
1771    /**
1772     * {@code LIKE %value%}
1773     *
1774     * @param column      列名
1775     * @param value       条件的值
1776     * @param isEffective 是否有效
1777     */
1778    public <V> QueryWrapper like(String column, V value, Predicate<V> isEffective) {
1779        and(QueryMethods.column(column).like(value, isEffective));
1780        return this;
1781    }
1782
1783    /**
1784     * {@code LIKE %value%}
1785     *
1786     * @param column      列名, lambda 展示
1787     * @param value       值
1788     * @param isEffective 是否有效
1789     */
1790    public <T, V> QueryWrapper like(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1791        and(QueryMethods.column(column).like(value, isEffective));
1792        return this;
1793    }
1794
1795
1796    /**
1797     * {@code LIKE value%}
1798     *
1799     * @param column 列名
1800     * @param value  条件的值
1801     */
1802    public QueryWrapper likeLeft(String column, Object value) {
1803        and(QueryMethods.column(column).likeLeft(value));
1804        return this;
1805    }
1806
1807    /**
1808     * {@code LIKE value%}
1809     *
1810     * @param column 列名, lambda 展示
1811     * @param value  值
1812     */
1813    public <T> QueryWrapper likeLeft(LambdaGetter<T> column, Object value) {
1814        and(QueryMethods.column(column).likeLeft(value));
1815        return this;
1816    }
1817
1818    /**
1819     * {@code LIKE value%}
1820     *
1821     * @param column      列名
1822     * @param value       条件的值
1823     * @param isEffective 是否有效
1824     */
1825    public QueryWrapper likeLeft(String column, Object value, boolean isEffective) {
1826        and(QueryMethods.column(column).likeLeft(value).when(isEffective));
1827        return this;
1828    }
1829
1830    /**
1831     * {@code LIKE value%}
1832     *
1833     * @param column      列名, lambda 展示
1834     * @param value       值
1835     * @param isEffective 是否有效
1836     */
1837    public <T> QueryWrapper likeLeft(LambdaGetter<T> column, Object value, boolean isEffective) {
1838        and(QueryMethods.column(column).likeLeft(value).when(isEffective));
1839        return this;
1840    }
1841
1842    /**
1843     * {@code LIKE value%}
1844     *
1845     * @param column      列名
1846     * @param value       条件的值
1847     * @param isEffective 是否有效
1848     */
1849    public <V> QueryWrapper likeLeft(String column, V value, Predicate<V> isEffective) {
1850        and(QueryMethods.column(column).likeLeft(value, isEffective));
1851        return this;
1852    }
1853
1854    /**
1855     * {@code LIKE value%}
1856     *
1857     * @param column      列名, lambda 展示
1858     * @param value       值
1859     * @param isEffective 是否有效
1860     */
1861    public <T, V> QueryWrapper likeLeft(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1862        and(QueryMethods.column(column).likeLeft(value, isEffective));
1863        return this;
1864    }
1865
1866
1867    /**
1868     * {@code LIKE %value}
1869     *
1870     * @param column 列名
1871     * @param value  条件的值
1872     */
1873    public QueryWrapper likeRight(String column, Object value) {
1874        and(QueryMethods.column(column).likeRight(value));
1875        return this;
1876    }
1877
1878    /**
1879     * {@code LIKE %value}
1880     *
1881     * @param column 列名, lambda 展示
1882     * @param value  值
1883     */
1884    public <T> QueryWrapper likeRight(LambdaGetter<T> column, Object value) {
1885        and(QueryMethods.column(column).likeRight(value));
1886        return this;
1887    }
1888
1889    /**
1890     * {@code LIKE %value}
1891     *
1892     * @param column      列名
1893     * @param value       条件的值
1894     * @param isEffective 是否有效
1895     */
1896    public QueryWrapper likeRight(String column, Object value, boolean isEffective) {
1897        and(QueryMethods.column(column).likeRight(value).when(isEffective));
1898        return this;
1899    }
1900
1901    /**
1902     * {@code LIKE %value}
1903     *
1904     * @param column      列名, lambda 展示
1905     * @param value       值
1906     * @param isEffective 是否有效
1907     */
1908    public <T> QueryWrapper likeRight(LambdaGetter<T> column, Object value, boolean isEffective) {
1909        and(QueryMethods.column(column).likeRight(value).when(isEffective));
1910        return this;
1911    }
1912
1913    /**
1914     * {@code LIKE %value}
1915     *
1916     * @param column      列名
1917     * @param value       条件的值
1918     * @param isEffective 是否有效
1919     */
1920    public <V> QueryWrapper likeRight(String column, V value, Predicate<V> isEffective) {
1921        and(QueryMethods.column(column).likeRight(value, isEffective));
1922        return this;
1923    }
1924
1925    /**
1926     * {@code LIKE %value}
1927     *
1928     * @param column      列名, lambda 展示
1929     * @param value       值
1930     * @param isEffective 是否有效
1931     */
1932    public <T, V> QueryWrapper likeRight(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
1933        and(QueryMethods.column(column).likeRight(value, isEffective));
1934        return this;
1935    }
1936
1937
1938    /**
1939     * {@code NOT LIKE %value%}
1940     *
1941     * @param column 列名
1942     * @param value  条件的值
1943     */
1944    public QueryWrapper notLike(String column, Object value) {
1945        and(QueryMethods.column(column).notLike(value));
1946        return this;
1947    }
1948
1949    /**
1950     * {@code NOT LIKE %value%}
1951     *
1952     * @param column 列名, lambda 展示
1953     * @param value  值
1954     */
1955    public <T> QueryWrapper notLike(LambdaGetter<T> column, Object value) {
1956        and(QueryMethods.column(column).notLike(value));
1957        return this;
1958    }
1959
1960    /**
1961     * {@code NOT LIKE %value%}
1962     *
1963     * @param column      列名
1964     * @param value       条件的值
1965     * @param isEffective 是否有效
1966     */
1967    public QueryWrapper notLike(String column, Object value, boolean isEffective) {
1968        and(QueryMethods.column(column).notLike(value).when(isEffective));
1969        return this;
1970    }
1971
1972    /**
1973     * {@code NOT LIKE %value%}
1974     *
1975     * @param column      列名, lambda 展示
1976     * @param value       值
1977     * @param isEffective 是否有效
1978     */
1979    public <T> QueryWrapper notLike(LambdaGetter<T> column, Object value, boolean isEffective) {
1980        and(QueryMethods.column(column).notLike(value).when(isEffective));
1981        return this;
1982    }
1983
1984    /**
1985     * {@code NOT LIKE %value%}
1986     *
1987     * @param column      列名
1988     * @param value       条件的值
1989     * @param isEffective 是否有效
1990     */
1991    public <V> QueryWrapper notLike(String column, V value, Predicate<V> isEffective) {
1992        and(QueryMethods.column(column).notLike(value, isEffective));
1993        return this;
1994    }
1995
1996    /**
1997     * {@code NOT LIKE %value%}
1998     *
1999     * @param column      列名, lambda 展示
2000     * @param value       值
2001     * @param isEffective 是否有效
2002     */
2003    public <T, V> QueryWrapper notLike(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
2004        and(QueryMethods.column(column).notLike(value, isEffective));
2005        return this;
2006    }
2007
2008
2009    /**
2010     * {@code NOT LIKE value%}
2011     *
2012     * @param column 列名
2013     * @param value  条件的值
2014     */
2015    public QueryWrapper notLikeLeft(String column, Object value) {
2016        and(QueryMethods.column(column).notLikeLeft(value));
2017        return this;
2018    }
2019
2020    /**
2021     * {@code NOT LIKE value%}
2022     *
2023     * @param column 列名, lambda 展示
2024     * @param value  值
2025     */
2026    public <T> QueryWrapper notLikeLeft(LambdaGetter<T> column, Object value) {
2027        and(QueryMethods.column(column).notLikeLeft(value));
2028        return this;
2029    }
2030
2031    /**
2032     * {@code NOT LIKE value%}
2033     *
2034     * @param column      列名
2035     * @param value       条件的值
2036     * @param isEffective 是否有效
2037     */
2038    public QueryWrapper notLikeLeft(String column, Object value, boolean isEffective) {
2039        and(QueryMethods.column(column).notLikeLeft(value).when(isEffective));
2040        return this;
2041    }
2042
2043    /**
2044     * {@code NOT LIKE value%}
2045     *
2046     * @param column      列名, lambda 展示
2047     * @param value       值
2048     * @param isEffective 是否有效
2049     */
2050    public <T> QueryWrapper notLikeLeft(LambdaGetter<T> column, Object value, boolean isEffective) {
2051        and(QueryMethods.column(column).notLikeLeft(value).when(isEffective));
2052        return this;
2053    }
2054
2055    /**
2056     * {@code NOT LIKE value%}
2057     *
2058     * @param column      列名
2059     * @param value       条件的值
2060     * @param isEffective 是否有效
2061     */
2062    public <V> QueryWrapper notLikeLeft(String column, V value, Predicate<V> isEffective) {
2063        and(QueryMethods.column(column).notLikeLeft(value, isEffective));
2064        return this;
2065    }
2066
2067    /**
2068     * {@code NOT LIKE value%}
2069     *
2070     * @param column      列名, lambda 展示
2071     * @param value       值
2072     * @param isEffective 是否有效
2073     */
2074    public <T, V> QueryWrapper notLikeLeft(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
2075        and(QueryMethods.column(column).notLikeLeft(value, isEffective));
2076        return this;
2077    }
2078
2079
2080    /**
2081     * {@code NOT LIKE %value}
2082     *
2083     * @param column 列名
2084     * @param value  条件的值
2085     */
2086    public QueryWrapper notLikeRight(String column, Object value) {
2087        and(QueryMethods.column(column).notLikeRight(value));
2088        return this;
2089    }
2090
2091    /**
2092     * {@code NOT LIKE %value}
2093     *
2094     * @param column 列名, lambda 展示
2095     * @param value  值
2096     */
2097    public <T> QueryWrapper notLikeRight(LambdaGetter<T> column, Object value) {
2098        and(QueryMethods.column(column).notLikeRight(value));
2099        return this;
2100    }
2101
2102    /**
2103     * {@code NOT LIKE %value}
2104     *
2105     * @param column      列名
2106     * @param value       条件的值
2107     * @param isEffective 是否有效
2108     */
2109    public QueryWrapper notLikeRight(String column, Object value, boolean isEffective) {
2110        and(QueryMethods.column(column).notLikeRight(value).when(isEffective));
2111        return this;
2112    }
2113
2114    /**
2115     * {@code NOT LIKE %value}
2116     *
2117     * @param column      列名, lambda 展示
2118     * @param value       值
2119     * @param isEffective 是否有效
2120     */
2121    public <T> QueryWrapper notLikeRight(LambdaGetter<T> column, Object value, boolean isEffective) {
2122        and(QueryMethods.column(column).notLikeRight(value).when(isEffective));
2123        return this;
2124    }
2125
2126    /**
2127     * {@code NOT LIKE %value}
2128     *
2129     * @param column      列名
2130     * @param value       条件的值
2131     * @param isEffective 是否有效
2132     */
2133    public <V> QueryWrapper notLikeRight(String column, V value, Predicate<V> isEffective) {
2134        and(QueryMethods.column(column).notLikeRight(value, isEffective));
2135        return this;
2136    }
2137
2138    /**
2139     * {@code NOT LIKE %value}
2140     *
2141     * @param column      列名, lambda 展示
2142     * @param value       值
2143     * @param isEffective 是否有效
2144     */
2145    public <T, V> QueryWrapper notLikeRight(LambdaGetter<T> column, V value, Predicate<V> isEffective) {
2146        and(QueryMethods.column(column).notLikeRight(value, isEffective));
2147        return this;
2148    }
2149
2150
2151    /**
2152     * {@code IS NULL}
2153     *
2154     * @param column 列名
2155     */
2156    public QueryWrapper isNull(String column) {
2157        and(QueryMethods.column(column).isNull());
2158        return this;
2159    }
2160
2161    /**
2162     * {@code IS NULL}
2163     *
2164     * @param column 列名, lambda 展示
2165     */
2166    public <T> QueryWrapper isNull(LambdaGetter<T> column) {
2167        and(QueryMethods.column(column).isNull());
2168        return this;
2169    }
2170
2171    /**
2172     * {@code IS NULL}
2173     *
2174     * @param column      列名
2175     * @param isEffective 是否有效
2176     */
2177    public QueryWrapper isNull(String column, boolean isEffective) {
2178        and(QueryMethods.column(column).isNull(isEffective));
2179        return this;
2180    }
2181
2182    /**
2183     * {@code IS NULL}
2184     *
2185     * @param column      列名, lambda 展示
2186     * @param isEffective 是否有效
2187     */
2188    public <T> QueryWrapper isNull(LambdaGetter<T> column, boolean isEffective) {
2189        and(QueryMethods.column(column).isNull(isEffective));
2190        return this;
2191    }
2192
2193    /**
2194     * {@code IS NULL}
2195     *
2196     * @param column      列名
2197     * @param isEffective 是否有效
2198     */
2199    public QueryWrapper isNull(String column, BooleanSupplier isEffective) {
2200        and(QueryMethods.column(column).isNull(isEffective));
2201        return this;
2202    }
2203
2204    /**
2205     * {@code IS NULL}
2206     *
2207     * @param column      列名, lambda 展示
2208     * @param isEffective 是否有效
2209     */
2210    public <T> QueryWrapper isNull(LambdaGetter<T> column, BooleanSupplier isEffective) {
2211        and(QueryMethods.column(column).isNull(isEffective));
2212        return this;
2213    }
2214
2215
2216    /**
2217     * {@code IS NOT NULL}
2218     *
2219     * @param column 列名
2220     */
2221    public QueryWrapper isNotNull(String column) {
2222        and(QueryMethods.column(column).isNotNull());
2223        return this;
2224    }
2225
2226    /**
2227     * {@code IS NOT NULL}
2228     *
2229     * @param column 列名, lambda 展示
2230     */
2231    public <T> QueryWrapper isNotNull(LambdaGetter<T> column) {
2232        and(QueryMethods.column(column).isNotNull());
2233        return this;
2234    }
2235
2236    /**
2237     * {@code IS NOT NULL}
2238     *
2239     * @param column      列名
2240     * @param isEffective 是否有效
2241     */
2242    public QueryWrapper isNotNull(String column, boolean isEffective) {
2243        and(QueryMethods.column(column).isNotNull(isEffective));
2244        return this;
2245    }
2246
2247    /**
2248     * {@code IS NOT NULL}
2249     *
2250     * @param column      列名, lambda 展示
2251     * @param isEffective 是否有效
2252     */
2253    public <T> QueryWrapper isNotNull(LambdaGetter<T> column, boolean isEffective) {
2254        and(QueryMethods.column(column).isNotNull(isEffective));
2255        return this;
2256    }
2257
2258    /**
2259     * {@code IS NOT NULL}
2260     *
2261     * @param column      列名
2262     * @param isEffective 是否有效
2263     */
2264    public QueryWrapper isNotNull(String column, BooleanSupplier isEffective) {
2265        and(QueryMethods.column(column).isNotNull(isEffective));
2266        return this;
2267    }
2268
2269    /**
2270     * {@code IS NOT NULL}
2271     *
2272     * @param column      列名, lambda 展示
2273     * @param isEffective 是否有效
2274     */
2275    public <T> QueryWrapper isNotNull(LambdaGetter<T> column, BooleanSupplier isEffective) {
2276        and(QueryMethods.column(column).isNotNull(isEffective));
2277        return this;
2278    }
2279
2280
2281    ////////内部方法////////
2282
2283    /**
2284     * 获取 queryWrapper 的参数
2285     * 在构建 sql 的时候,需要保证 where 在 having 的前面
2286     */
2287    Object[] getAllValueArray() {
2288
2289        List<Object> withValues = null;
2290        if (with != null) {
2291            Object[] paramValues = with.getParamValues();
2292            if (ArrayUtil.isNotEmpty(paramValues)) {
2293                withValues = new ArrayList<>(Arrays.asList(paramValues));
2294
2295            }
2296        }
2297
2298        List<Object> columnValues = null;
2299        List<QueryColumn> selectColumns = getSelectColumns();
2300        if (CollectionUtil.isNotEmpty(selectColumns)) {
2301            for (QueryColumn selectColumn : selectColumns) {
2302                if (selectColumn instanceof HasParamsColumn) {
2303                    Object[] paramValues = ((HasParamsColumn) selectColumn).getParamValues();
2304                    if (ArrayUtil.isNotEmpty(paramValues)) {
2305                        if (columnValues == null) {
2306                            columnValues = new ArrayList<>(paramValues.length);
2307                        }
2308                        columnValues.addAll(Arrays.asList(paramValues));
2309                    }
2310                }
2311            }
2312        }
2313
2314        //select 子查询的参数:select * from (select ....)
2315        List<Object> tableValues = null;
2316        List<QueryTable> queryTables = getQueryTables();
2317        if (CollectionUtil.isNotEmpty(queryTables)) {
2318            for (QueryTable queryTable : queryTables) {
2319                Object[] tableValueArray = queryTable.getValueArray();
2320                if (tableValueArray.length > 0) {
2321                    if (tableValues == null) {
2322                        tableValues = new ArrayList<>(tableValueArray.length);
2323                    }
2324                    tableValues.addAll(Arrays.asList(tableValueArray));
2325                }
2326            }
2327        }
2328
2329        //join 子查询的参数:left join (select ...)
2330        List<Object> joinValues = null;
2331        List<Join> joins = getJoins();
2332        if (CollectionUtil.isNotEmpty(joins)) {
2333            for (Join join : joins) {
2334                QueryTable joinTable = join.getQueryTable();
2335                Object[] valueArray = joinTable.getValueArray();
2336                if (valueArray.length > 0) {
2337                    if (joinValues == null) {
2338                        joinValues = new ArrayList<>(valueArray.length);
2339                    }
2340                    joinValues.addAll(Arrays.asList(valueArray));
2341                }
2342                QueryCondition onCondition = join.getOnCondition();
2343                Object[] values = WrapperUtil.getValues(onCondition);
2344                if (values.length > 0) {
2345                    if (joinValues == null) {
2346                        joinValues = new ArrayList<>(values.length);
2347                    }
2348                    joinValues.addAll(Arrays.asList(values));
2349                }
2350            }
2351        }
2352
2353        //where 参数
2354        Object[] whereValues = WrapperUtil.getValues(whereQueryCondition);
2355
2356        //having 参数
2357        Object[] havingValues = WrapperUtil.getValues(havingQueryCondition);
2358
2359        Object[] paramValues = ArrayUtil.concat(whereValues, havingValues);
2360
2361        //unions 参数
2362        if (CollectionUtil.isNotEmpty(unions)) {
2363            for (UnionWrapper union : unions) {
2364                QueryWrapper queryWrapper = union.getQueryWrapper();
2365                paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray());
2366            }
2367        }
2368
2369        Object[] returnValues = withValues == null ? FlexConsts.EMPTY_ARRAY : withValues.toArray();
2370        returnValues = columnValues != null ? ArrayUtil.concat(returnValues, columnValues.toArray()) : returnValues;
2371        returnValues = tableValues != null ? ArrayUtil.concat(returnValues, tableValues.toArray()) : returnValues;
2372        returnValues = joinValues != null ? ArrayUtil.concat(returnValues, joinValues.toArray()) : returnValues;
2373        returnValues = ArrayUtil.concat(returnValues, paramValues);
2374
2375        return returnValues;
2376    }
2377
2378
2379    /**
2380     * 获取 queryWrapper 的参数
2381     * 在构建 sql 的时候,需要保证 where 在 having 的前面
2382     */
2383    Object[] getJoinValueArray() {
2384        //join 子查询的参数:left join (select ...)
2385        List<Object> joinValues = null;
2386        List<Join> joins = getJoins();
2387        if (CollectionUtil.isNotEmpty(joins)) {
2388            for (Join join : joins) {
2389                QueryTable joinTable = join.getQueryTable();
2390                Object[] valueArray = joinTable.getValueArray();
2391                if (valueArray.length > 0) {
2392                    if (joinValues == null) {
2393                        joinValues = new ArrayList<>(valueArray.length);
2394                    }
2395                    joinValues.addAll(Arrays.asList(valueArray));
2396                }
2397                QueryCondition onCondition = join.getOnCondition();
2398                Object[] values = WrapperUtil.getValues(onCondition);
2399                if (values.length > 0) {
2400                    if (joinValues == null) {
2401                        joinValues = new ArrayList<>(values.length);
2402                    }
2403                    joinValues.addAll(Arrays.asList(values));
2404                }
2405            }
2406        }
2407
2408        return joinValues == null ? FlexConsts.EMPTY_ARRAY : joinValues.toArray();
2409    }
2410
2411
2412    /**
2413     * 获取 queryWrapper 的参数
2414     * 在构建 sql 的时候,需要保证 where 在 having 的前面
2415     */
2416    Object[] getConditionValueArray() {
2417        //where 参数
2418        Object[] whereValues = WrapperUtil.getValues(whereQueryCondition);
2419
2420        //having 参数
2421        Object[] havingValues = WrapperUtil.getValues(havingQueryCondition);
2422
2423        Object[] paramValues = ArrayUtil.concat(whereValues, havingValues);
2424
2425        //unions 参数
2426        if (CollectionUtil.isNotEmpty(unions)) {
2427            for (UnionWrapper union : unions) {
2428                QueryWrapper queryWrapper = union.getQueryWrapper();
2429                paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray());
2430            }
2431        }
2432
2433        return paramValues;
2434    }
2435
2436
2437    List<QueryWrapper> getChildSelect() {
2438
2439        List<QueryWrapper> tableChildQuery = null;
2440        List<QueryTable> queryTables = getQueryTables();
2441        if (CollectionUtil.isNotEmpty(queryTables)) {
2442            for (QueryTable queryTable : queryTables) {
2443                if (queryTable instanceof SelectQueryTable) {
2444                    if (tableChildQuery == null) {
2445                        tableChildQuery = new ArrayList<>();
2446                    }
2447                    tableChildQuery.add(((SelectQueryTable) queryTable).getQueryWrapper());
2448                }
2449            }
2450        }
2451
2452        List<QueryWrapper> whereChildQuery = WrapperUtil.getChildQueryWrapper(whereQueryCondition);
2453        List<QueryWrapper> havingChildQuery = WrapperUtil.getChildQueryWrapper(havingQueryCondition);
2454
2455        if (tableChildQuery == null && whereChildQuery.isEmpty() && havingChildQuery.isEmpty()) {
2456            return Collections.emptyList();
2457        }
2458
2459        List<QueryWrapper> childQueryWrappers = tableChildQuery == null ? new ArrayList<>()
2460            : new ArrayList<>(tableChildQuery);
2461        childQueryWrappers.addAll(whereChildQuery);
2462        childQueryWrappers.addAll(havingChildQuery);
2463
2464        return childQueryWrappers;
2465    }
2466
2467    public String toSQL() {
2468        String sql = DialectFactory.getDialect().forSelectByQuery(this);
2469        return SqlUtil.replaceSqlParams(sql, getAllValueArray());
2470    }
2471
2472    @Override
2473    public QueryWrapper clone() {
2474        return super.clone();
2475    }
2476
2477}