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