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