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