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}