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.isBlank(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.isNotBlank(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.isNotBlank(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 and(QueryMethods.column(column).eq(value).when(isEffective)); 892 return this; 893 } 894 895 /** 896 * 等于 {@code =} 897 * 898 * @param column 列名, lambda 展示 899 * @param value 值 900 * @param isEffective 是否有效 901 */ 902 public <T> QueryWrapper eq(LambdaGetter<T> column, Object value, boolean isEffective) { 903 and(QueryMethods.column(column).eq(value).when(isEffective)); 904 return this; 905 } 906 907 /** 908 * 等于 {@code =} 909 * 910 * @param column 列名 911 * @param value 条件的值 912 * @param isEffective 是否有效 913 */ 914 public <V> QueryWrapper eq(String column, V value, Predicate<V> isEffective) { 915 and(QueryMethods.column(column).eq(value, isEffective)); 916 return this; 917 } 918 919 /** 920 * 等于 {@code =} 921 * 922 * @param column 列名, lambda 展示 923 * @param value 值 924 * @param isEffective 是否有效 925 */ 926 public <T, V> QueryWrapper eq(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 927 and(QueryMethods.column(column).eq(value, isEffective)); 928 return this; 929 } 930 931 932 /** 933 * 不等于 {@code !=} 934 * 935 * @param column 列名 936 * @param value 条件的值 937 */ 938 public QueryWrapper ne(String column, Object value) { 939 and(QueryMethods.column(column).ne(value)); 940 return this; 941 } 942 943 /** 944 * 不等于 {@code !=} 945 * 946 * @param column 列名, lambda 展示 947 * @param value 值 948 */ 949 public <T> QueryWrapper ne(LambdaGetter<T> column, Object value) { 950 and(QueryMethods.column(column).ne(value)); 951 return this; 952 } 953 954 /** 955 * 不等于 {@code !=} 956 * 957 * @param column 列名 958 * @param value 条件的值 959 * @param isEffective 是否有效 960 */ 961 public QueryWrapper ne(String column, Object value, boolean isEffective) { 962 and(QueryMethods.column(column).ne(value).when(isEffective)); 963 return this; 964 } 965 966 /** 967 * 不等于 {@code !=} 968 * 969 * @param column 列名, lambda 展示 970 * @param value 值 971 * @param isEffective 是否有效 972 */ 973 public <T> QueryWrapper ne(LambdaGetter<T> column, Object value, boolean isEffective) { 974 and(QueryMethods.column(column).ne(value).when(isEffective)); 975 return this; 976 } 977 978 /** 979 * 不等于 {@code !=} 980 * 981 * @param column 列名 982 * @param value 条件的值 983 * @param isEffective 是否有效 984 */ 985 public <V> QueryWrapper ne(String column, V value, Predicate<V> isEffective) { 986 and(QueryMethods.column(column).ne(value, isEffective)); 987 return this; 988 } 989 990 /** 991 * 不等于 {@code !=} 992 * 993 * @param column 列名, lambda 展示 994 * @param value 值 995 * @param isEffective 是否有效 996 */ 997 public <T, V> QueryWrapper ne(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 998 and(QueryMethods.column(column).ne(value, isEffective)); 999 return this; 1000 } 1001 1002 1003 /** 1004 * 大于 {@code >} 1005 * 1006 * @param column 列名 1007 * @param value 条件的值 1008 */ 1009 public QueryWrapper gt(String column, Object value) { 1010 and(QueryMethods.column(column).gt(value)); 1011 return this; 1012 } 1013 1014 /** 1015 * 大于 {@code >} 1016 * 1017 * @param column 列名, lambda 展示 1018 * @param value 值 1019 */ 1020 public <T> QueryWrapper gt(LambdaGetter<T> column, Object value) { 1021 and(QueryMethods.column(column).gt(value)); 1022 return this; 1023 } 1024 1025 /** 1026 * 大于 {@code >} 1027 * 1028 * @param column 列名 1029 * @param value 条件的值 1030 * @param isEffective 是否有效 1031 */ 1032 public QueryWrapper gt(String column, Object value, boolean isEffective) { 1033 and(QueryMethods.column(column).gt(value).when(isEffective)); 1034 return this; 1035 } 1036 1037 /** 1038 * 大于 {@code >} 1039 * 1040 * @param column 列名, lambda 展示 1041 * @param value 值 1042 * @param isEffective 是否有效 1043 */ 1044 public <T> QueryWrapper gt(LambdaGetter<T> column, Object value, boolean isEffective) { 1045 and(QueryMethods.column(column).gt(value).when(isEffective)); 1046 return this; 1047 } 1048 1049 /** 1050 * 大于 {@code >} 1051 * 1052 * @param column 列名 1053 * @param value 条件的值 1054 * @param isEffective 是否有效 1055 */ 1056 public <V> QueryWrapper gt(String column, V value, Predicate<V> isEffective) { 1057 and(QueryMethods.column(column).gt(value, isEffective)); 1058 return this; 1059 } 1060 1061 /** 1062 * 大于 {@code >} 1063 * 1064 * @param column 列名, lambda 展示 1065 * @param value 值 1066 * @param isEffective 是否有效 1067 */ 1068 public <T, V> QueryWrapper gt(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1069 and(QueryMethods.column(column).gt(value, isEffective)); 1070 return this; 1071 } 1072 1073 1074 /** 1075 * 大于等于 {@code >=} 1076 * 1077 * @param column 列名 1078 * @param value 条件的值 1079 */ 1080 public QueryWrapper ge(String column, Object value) { 1081 and(QueryMethods.column(column).ge(value)); 1082 return this; 1083 } 1084 1085 /** 1086 * 大于等于 {@code >=} 1087 * 1088 * @param column 列名, lambda 展示 1089 * @param value 值 1090 */ 1091 public <T> QueryWrapper ge(LambdaGetter<T> column, Object value) { 1092 and(QueryMethods.column(column).ge(value)); 1093 return this; 1094 } 1095 1096 /** 1097 * 大于等于 {@code >=} 1098 * 1099 * @param column 列名 1100 * @param value 条件的值 1101 * @param isEffective 是否有效 1102 */ 1103 public QueryWrapper ge(String column, Object value, boolean isEffective) { 1104 and(QueryMethods.column(column).ge(value).when(isEffective)); 1105 return this; 1106 } 1107 1108 /** 1109 * 大于等于 {@code >=} 1110 * 1111 * @param column 列名, lambda 展示 1112 * @param value 值 1113 * @param isEffective 是否有效 1114 */ 1115 public <T> QueryWrapper ge(LambdaGetter<T> column, Object value, boolean isEffective) { 1116 and(QueryMethods.column(column).ge(value).when(isEffective)); 1117 return this; 1118 } 1119 1120 /** 1121 * 大于等于 {@code >=} 1122 * 1123 * @param column 列名 1124 * @param value 条件的值 1125 * @param isEffective 是否有效 1126 */ 1127 public <V> QueryWrapper ge(String column, V value, Predicate<V> isEffective) { 1128 and(QueryMethods.column(column).ge(value, isEffective)); 1129 return this; 1130 } 1131 1132 /** 1133 * 大于等于 {@code >=} 1134 * 1135 * @param column 列名, lambda 展示 1136 * @param value 值 1137 * @param isEffective 是否有效 1138 */ 1139 public <T, V> QueryWrapper ge(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1140 and(QueryMethods.column(column).ge(value, isEffective)); 1141 return this; 1142 } 1143 1144 1145 /** 1146 * 小于 {@code <} 1147 * 1148 * @param column 列名 1149 * @param value 条件的值 1150 */ 1151 public QueryWrapper lt(String column, Object value) { 1152 and(QueryMethods.column(column).lt(value)); 1153 return this; 1154 } 1155 1156 /** 1157 * 小于 {@code <} 1158 * 1159 * @param column 列名, lambda 展示 1160 * @param value 值 1161 */ 1162 public <T> QueryWrapper lt(LambdaGetter<T> column, Object value) { 1163 and(QueryMethods.column(column).lt(value)); 1164 return this; 1165 } 1166 1167 /** 1168 * 小于 {@code <} 1169 * 1170 * @param column 列名 1171 * @param value 条件的值 1172 * @param isEffective 是否有效 1173 */ 1174 public QueryWrapper lt(String column, Object value, boolean isEffective) { 1175 and(QueryMethods.column(column).lt(value).when(isEffective)); 1176 return this; 1177 } 1178 1179 /** 1180 * 小于 {@code <} 1181 * 1182 * @param column 列名, lambda 展示 1183 * @param value 值 1184 * @param isEffective 是否有效 1185 */ 1186 public <T> QueryWrapper lt(LambdaGetter<T> column, Object value, boolean isEffective) { 1187 and(QueryMethods.column(column).lt(value).when(isEffective)); 1188 return this; 1189 } 1190 1191 /** 1192 * 小于 {@code <} 1193 * 1194 * @param column 列名 1195 * @param value 条件的值 1196 * @param isEffective 是否有效 1197 */ 1198 public <V> QueryWrapper lt(String column, V value, Predicate<V> isEffective) { 1199 and(QueryMethods.column(column).lt(value, isEffective)); 1200 return this; 1201 } 1202 1203 /** 1204 * 小于 {@code <} 1205 * 1206 * @param column 列名, lambda 展示 1207 * @param value 值 1208 * @param isEffective 是否有效 1209 */ 1210 public <T, V> QueryWrapper lt(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1211 and(QueryMethods.column(column).lt(value, isEffective)); 1212 return this; 1213 } 1214 1215 1216 /** 1217 * 小于等于 {@code <=} 1218 * 1219 * @param column 列名 1220 * @param value 条件的值 1221 */ 1222 public QueryWrapper le(String column, Object value) { 1223 and(QueryMethods.column(column).le(value)); 1224 return this; 1225 } 1226 1227 /** 1228 * 小于等于 {@code <=} 1229 * 1230 * @param column 列名, lambda 展示 1231 * @param value 值 1232 */ 1233 public <T> QueryWrapper le(LambdaGetter<T> column, Object value) { 1234 and(QueryMethods.column(column).le(value)); 1235 return this; 1236 } 1237 1238 /** 1239 * 小于等于 {@code <=} 1240 * 1241 * @param column 列名 1242 * @param value 条件的值 1243 * @param isEffective 是否有效 1244 */ 1245 public QueryWrapper le(String column, Object value, boolean isEffective) { 1246 and(QueryMethods.column(column).le(value).when(isEffective)); 1247 return this; 1248 } 1249 1250 /** 1251 * 小于等于 {@code <=} 1252 * 1253 * @param column 列名, lambda 展示 1254 * @param value 值 1255 * @param isEffective 是否有效 1256 */ 1257 public <T> QueryWrapper le(LambdaGetter<T> column, Object value, boolean isEffective) { 1258 and(QueryMethods.column(column).le(value).when(isEffective)); 1259 return this; 1260 } 1261 1262 /** 1263 * 小于等于 {@code <=} 1264 * 1265 * @param column 列名 1266 * @param value 条件的值 1267 * @param isEffective 是否有效 1268 */ 1269 public <V> QueryWrapper le(String column, V value, Predicate<V> isEffective) { 1270 and(QueryMethods.column(column).le(value, isEffective)); 1271 return this; 1272 } 1273 1274 /** 1275 * 小于等于 {@code <=} 1276 * 1277 * @param column 列名, lambda 展示 1278 * @param value 值 1279 * @param isEffective 是否有效 1280 */ 1281 public <T, V> QueryWrapper le(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1282 and(QueryMethods.column(column).le(value, isEffective)); 1283 return this; 1284 } 1285 1286 1287 /** 1288 * {@code IN(value)} 1289 * 1290 * @param column 列名 1291 * @param values 条件的值 1292 */ 1293 public QueryWrapper in(String column, Object... values) { 1294 and(QueryMethods.column(column).in(values)); 1295 return this; 1296 } 1297 1298 /** 1299 * {@code IN(value)} 1300 * 1301 * @param column 列名, lambda 展示 1302 * @param values 值 1303 */ 1304 public <T> QueryWrapper in(LambdaGetter<T> column, Object... values) { 1305 and(QueryMethods.column(column).in(values)); 1306 return this; 1307 } 1308 1309 1310 /** 1311 * {@code IN(value)} 1312 * 1313 * @param column 列名 1314 * @param queryWrapper 条件的值 1315 */ 1316 public QueryWrapper in(String column, QueryWrapper queryWrapper) { 1317 and(QueryMethods.column(column).in(queryWrapper)); 1318 return this; 1319 } 1320 1321 1322 /** 1323 * {@code IN(value)} 1324 * 1325 * @param column 列名, lambda 展示 1326 * @param queryWrapper 值 1327 */ 1328 public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper) { 1329 and(QueryMethods.column(column).in(queryWrapper)); 1330 return this; 1331 } 1332 1333 1334 /** 1335 * {@code IN(value)} 1336 * 1337 * @param column 列名 1338 * @param values 条件的值 1339 */ 1340 public QueryWrapper in(String column, Collection<?> values) { 1341 and(QueryMethods.column(column).in(values)); 1342 return this; 1343 } 1344 1345 /** 1346 * {@code IN(value)} 1347 * 1348 * @param column 列名, lambda 展示 1349 * @param values 值 1350 */ 1351 public <T> QueryWrapper in(LambdaGetter<T> column, Collection<?> values) { 1352 and(QueryMethods.column(column).in(values)); 1353 return this; 1354 } 1355 1356 1357 /** 1358 * {@code IN(value)} 1359 * 1360 * @param column 列名 1361 * @param values 条件的值 1362 */ 1363 public QueryWrapper in(String column, Object[] values, boolean isEffective) { 1364 and(QueryMethods.column(column).in(values, isEffective)); 1365 return this; 1366 } 1367 1368 /** 1369 * {@code IN(value)} 1370 * 1371 * @param column 列名, lambda 展示 1372 * @param values 值 1373 */ 1374 public <T> QueryWrapper in(LambdaGetter<T> column, Object[] values, boolean isEffective) { 1375 and(QueryMethods.column(column).in(values, isEffective)); 1376 return this; 1377 } 1378 1379 1380 /** 1381 * {@code IN(value)} 1382 * 1383 * @param column 列名 1384 * @param values 条件的值 1385 */ 1386 public QueryWrapper in(String column, Collection<?> values, boolean isEffective) { 1387 and(QueryMethods.column(column).in(values, isEffective)); 1388 return this; 1389 } 1390 1391 /** 1392 * {@code IN(value)} 1393 * 1394 * @param column 列名, lambda 展示 1395 * @param values 值 1396 */ 1397 public <T> QueryWrapper in(LambdaGetter<T> column, Collection<?> values, boolean isEffective) { 1398 and(QueryMethods.column(column).in(values, isEffective)); 1399 return this; 1400 } 1401 1402 1403 /** 1404 * {@code IN(value)} 1405 * 1406 * @param column 列名 1407 * @param queryWrapper 条件的值 1408 */ 1409 public QueryWrapper in(String column, QueryWrapper queryWrapper, boolean isEffective) { 1410 and(QueryMethods.column(column).in(queryWrapper, isEffective)); 1411 return this; 1412 } 1413 1414 1415 /** 1416 * {@code IN(value)} 1417 * 1418 * @param column 列名, lambda 展示 1419 * @param queryWrapper 值 1420 */ 1421 public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper, boolean isEffective) { 1422 and(QueryMethods.column(column).in(queryWrapper, isEffective)); 1423 return this; 1424 } 1425 1426 1427 /** 1428 * {@code IN(value)} 1429 * 1430 * @param column 列名 1431 * @param queryWrapper 条件的值 1432 */ 1433 public QueryWrapper in(String column, QueryWrapper queryWrapper, BooleanSupplier isEffective) { 1434 and(QueryMethods.column(column).in(queryWrapper, isEffective)); 1435 return this; 1436 } 1437 1438 1439 /** 1440 * {@code IN(value)} 1441 * 1442 * @param column 列名, lambda 展示 1443 * @param queryWrapper 值 1444 */ 1445 public <T> QueryWrapper in(LambdaGetter<T> column, QueryWrapper queryWrapper, BooleanSupplier isEffective) { 1446 and(QueryMethods.column(column).in(queryWrapper, isEffective)); 1447 return this; 1448 } 1449 1450 1451 /** 1452 * {@code NOT IN(value)} 1453 * 1454 * @param column 列名 1455 * @param values 条件的值 1456 */ 1457 public QueryWrapper notIn(String column, Object... values) { 1458 and(QueryMethods.column(column).notIn(values)); 1459 return this; 1460 } 1461 1462 /** 1463 * {@code NOT IN(value)} 1464 * 1465 * @param column 列名, lambda 展示 1466 * @param values 值 1467 */ 1468 public <T> QueryWrapper notIn(LambdaGetter<T> column, Object... values) { 1469 and(QueryMethods.column(column).notIn(values)); 1470 return this; 1471 } 1472 1473 1474 /** 1475 * {@code NOT IN(value)} 1476 * 1477 * @param column 列名 1478 * @param queryWrapper 条件的值 1479 */ 1480 public QueryWrapper notIn(String column, QueryWrapper queryWrapper) { 1481 and(QueryMethods.column(column).notIn(queryWrapper)); 1482 return this; 1483 } 1484 1485 1486 /** 1487 * {@code NOT IN(value)} 1488 * 1489 * @param column 列名, lambda 展示 1490 * @param queryWrapper 值 1491 */ 1492 public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper) { 1493 and(QueryMethods.column(column).notIn(queryWrapper)); 1494 return this; 1495 } 1496 1497 1498 /** 1499 * {@code NOT IN(value)} 1500 * 1501 * @param column 列名 1502 * @param values 条件的值 1503 */ 1504 public QueryWrapper notIn(String column, Collection<?> values) { 1505 and(QueryMethods.column(column).notIn(values)); 1506 return this; 1507 } 1508 1509 /** 1510 * {@code NOT IN(value)} 1511 * 1512 * @param column 列名, lambda 展示 1513 * @param values 值 1514 */ 1515 public <T> QueryWrapper notIn(LambdaGetter<T> column, Collection<?> values) { 1516 and(QueryMethods.column(column).notIn(values)); 1517 return this; 1518 } 1519 1520 1521 /** 1522 * {@code NOT IN(value)} 1523 * 1524 * @param column 列名 1525 * @param values 条件的值 1526 */ 1527 public QueryWrapper notIn(String column, Object[] values, boolean isEffective) { 1528 and(QueryMethods.column(column).notIn(values, isEffective)); 1529 return this; 1530 } 1531 1532 /** 1533 * {@code NOT IN(value)} 1534 * 1535 * @param column 列名, lambda 展示 1536 * @param values 值 1537 */ 1538 public <T> QueryWrapper notIn(LambdaGetter<T> column, Object[] values, boolean isEffective) { 1539 and(QueryMethods.column(column).notIn(values, isEffective)); 1540 return this; 1541 } 1542 1543 1544 /** 1545 * {@code NOT IN(value)} 1546 * 1547 * @param column 列名 1548 * @param values 条件的值 1549 */ 1550 public QueryWrapper notIn(String column, Collection<?> values, boolean isEffective) { 1551 and(QueryMethods.column(column).notIn(values, isEffective)); 1552 return this; 1553 } 1554 1555 /** 1556 * {@code NOT IN(value)} 1557 * 1558 * @param column 列名, lambda 展示 1559 * @param values 值 1560 */ 1561 public <T> QueryWrapper notIn(LambdaGetter<T> column, Collection<?> values, boolean isEffective) { 1562 and(QueryMethods.column(column).notIn(values, isEffective)); 1563 return this; 1564 } 1565 1566 1567 /** 1568 * {@code NOT IN(value)} 1569 * 1570 * @param column 列名 1571 * @param queryWrapper 条件的值 1572 */ 1573 public QueryWrapper notIn(String column, QueryWrapper queryWrapper, boolean isEffective) { 1574 and(QueryMethods.column(column).notIn(queryWrapper, isEffective)); 1575 return this; 1576 } 1577 1578 1579 /** 1580 * {@code NOT IN(value)} 1581 * 1582 * @param column 列名, lambda 展示 1583 * @param queryWrapper 值 1584 */ 1585 public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper, boolean isEffective) { 1586 and(QueryMethods.column(column).notIn(queryWrapper, isEffective)); 1587 return this; 1588 } 1589 1590 1591 /** 1592 * {@code NOT IN(value)} 1593 * 1594 * @param column 列名 1595 * @param queryWrapper 条件的值 1596 */ 1597 public QueryWrapper notIn(String column, QueryWrapper queryWrapper, BooleanSupplier isEffective) { 1598 and(QueryMethods.column(column).notIn(queryWrapper, isEffective)); 1599 return this; 1600 } 1601 1602 1603 /** 1604 * {@code NOT IN(value)} 1605 * 1606 * @param column 列名, lambda 展示 1607 * @param queryWrapper 值 1608 */ 1609 public <T> QueryWrapper notIn(LambdaGetter<T> column, QueryWrapper queryWrapper, BooleanSupplier isEffective) { 1610 and(QueryMethods.column(column).notIn(queryWrapper, isEffective)); 1611 return this; 1612 } 1613 1614 1615 /** 1616 * {@code BETWEEN start AND end} 1617 * 1618 * @param column 列名 1619 * @param start 开始的值 1620 * @param end 结束的值 1621 */ 1622 public QueryWrapper between(String column, Object start, Object end) { 1623 and(QueryMethods.column(column).between(start, end)); 1624 return this; 1625 } 1626 1627 /** 1628 * {@code BETWEEN start AND end} 1629 * 1630 * @param column 列名 1631 * @param start 开始的值 1632 * @param end 结束的值 1633 */ 1634 public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end) { 1635 and(QueryMethods.column(column).between(start, end)); 1636 return this; 1637 } 1638 1639 /** 1640 * {@code BETWEEN start AND end} 1641 * 1642 * @param column 列名 1643 * @param start 开始的值 1644 * @param end 结束的值 1645 */ 1646 public QueryWrapper between(String column, Object start, Object end, boolean isEffective) { 1647 and(QueryMethods.column(column).between(start, end, isEffective)); 1648 return this; 1649 } 1650 1651 /** 1652 * {@code BETWEEN start AND end} 1653 * 1654 * @param column 列名 1655 * @param start 开始的值 1656 * @param end 结束的值 1657 */ 1658 public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end, boolean isEffective) { 1659 and(QueryMethods.column(column).between(start, end, isEffective)); 1660 return this; 1661 } 1662 1663 1664 /** 1665 * {@code BETWEEN start AND end} 1666 * 1667 * @param column 列名 1668 * @param start 开始的值 1669 * @param end 结束的值 1670 */ 1671 public QueryWrapper between(String column, Object start, Object end, BooleanSupplier isEffective) { 1672 and(QueryMethods.column(column).between(start, end, isEffective)); 1673 return this; 1674 } 1675 1676 /** 1677 * {@code BETWEEN start AND end} 1678 * 1679 * @param column 列名 1680 * @param start 开始的值 1681 * @param end 结束的值 1682 */ 1683 public <T> QueryWrapper between(LambdaGetter<T> column, Object start, Object end, BooleanSupplier isEffective) { 1684 and(QueryMethods.column(column).between(start, end, isEffective)); 1685 return this; 1686 } 1687 1688 1689 /** 1690 * {@code NOT BETWEEN start AND end} 1691 * 1692 * @param column 列名 1693 * @param start 开始的值 1694 * @param end 结束的值 1695 */ 1696 public QueryWrapper notBetween(String column, Object start, Object end) { 1697 and(QueryMethods.column(column).notBetween(start, end)); 1698 return this; 1699 } 1700 1701 /** 1702 * {@code NOT BETWEEN start AND end} 1703 * 1704 * @param column 列名 1705 * @param start 开始的值 1706 * @param end 结束的值 1707 */ 1708 public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end) { 1709 and(QueryMethods.column(column).notBetween(start, end)); 1710 return this; 1711 } 1712 1713 /** 1714 * {@code NOT BETWEEN start AND end} 1715 * 1716 * @param column 列名 1717 * @param start 开始的值 1718 * @param end 结束的值 1719 */ 1720 public QueryWrapper notBetween(String column, Object start, Object end, boolean isEffective) { 1721 and(QueryMethods.column(column).notBetween(start, end, isEffective)); 1722 return this; 1723 } 1724 1725 /** 1726 * {@code NOT BETWEEN start AND end} 1727 * 1728 * @param column 列名 1729 * @param start 开始的值 1730 * @param end 结束的值 1731 */ 1732 public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end, boolean isEffective) { 1733 and(QueryMethods.column(column).notBetween(start, end, isEffective)); 1734 return this; 1735 } 1736 1737 1738 /** 1739 * {@code NOT BETWEEN start AND end} 1740 * 1741 * @param column 列名 1742 * @param start 开始的值 1743 * @param end 结束的值 1744 */ 1745 public QueryWrapper notBetween(String column, Object start, Object end, BooleanSupplier isEffective) { 1746 and(QueryMethods.column(column).notBetween(start, end, isEffective)); 1747 return this; 1748 } 1749 1750 /** 1751 * {@code NOT BETWEEN start AND end} 1752 * 1753 * @param column 列名 1754 * @param start 开始的值 1755 * @param end 结束的值 1756 */ 1757 public <T> QueryWrapper notBetween(LambdaGetter<T> column, Object start, Object end, BooleanSupplier isEffective) { 1758 and(QueryMethods.column(column).notBetween(start, end, isEffective)); 1759 return this; 1760 } 1761 1762 1763 /** 1764 * {@code LIKE %value%} 1765 * 1766 * @param column 列名 1767 * @param value 条件的值 1768 */ 1769 public QueryWrapper like(String column, Object value) { 1770 and(QueryMethods.column(column).like(value)); 1771 return this; 1772 } 1773 1774 /** 1775 * {@code LIKE %value%} 1776 * 1777 * @param column 列名, lambda 展示 1778 * @param value 值 1779 */ 1780 public <T> QueryWrapper like(LambdaGetter<T> column, Object value) { 1781 and(QueryMethods.column(column).like(value)); 1782 return this; 1783 } 1784 1785 /** 1786 * {@code LIKE %value%} 1787 * 1788 * @param column 列名 1789 * @param value 条件的值 1790 * @param isEffective 是否有效 1791 */ 1792 public QueryWrapper like(String column, Object value, boolean isEffective) { 1793 and(QueryMethods.column(column).like(value).when(isEffective)); 1794 return this; 1795 } 1796 1797 /** 1798 * {@code LIKE %value%} 1799 * 1800 * @param column 列名, lambda 展示 1801 * @param value 值 1802 * @param isEffective 是否有效 1803 */ 1804 public <T> QueryWrapper like(LambdaGetter<T> column, Object value, boolean isEffective) { 1805 and(QueryMethods.column(column).like(value).when(isEffective)); 1806 return this; 1807 } 1808 1809 /** 1810 * {@code LIKE %value%} 1811 * 1812 * @param column 列名 1813 * @param value 条件的值 1814 * @param isEffective 是否有效 1815 */ 1816 public <V> QueryWrapper like(String column, V value, Predicate<V> isEffective) { 1817 and(QueryMethods.column(column).like(value, isEffective)); 1818 return this; 1819 } 1820 1821 /** 1822 * {@code LIKE %value%} 1823 * 1824 * @param column 列名, lambda 展示 1825 * @param value 值 1826 * @param isEffective 是否有效 1827 */ 1828 public <T, V> QueryWrapper like(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1829 and(QueryMethods.column(column).like(value, isEffective)); 1830 return this; 1831 } 1832 1833 1834 /** 1835 * {@code LIKE value%} 1836 * 1837 * @param column 列名 1838 * @param value 条件的值 1839 */ 1840 public QueryWrapper likeLeft(String column, Object value) { 1841 and(QueryMethods.column(column).likeLeft(value)); 1842 return this; 1843 } 1844 1845 /** 1846 * {@code LIKE value%} 1847 * 1848 * @param column 列名, lambda 展示 1849 * @param value 值 1850 */ 1851 public <T> QueryWrapper likeLeft(LambdaGetter<T> column, Object value) { 1852 and(QueryMethods.column(column).likeLeft(value)); 1853 return this; 1854 } 1855 1856 /** 1857 * {@code LIKE value%} 1858 * 1859 * @param column 列名 1860 * @param value 条件的值 1861 * @param isEffective 是否有效 1862 */ 1863 public QueryWrapper likeLeft(String column, Object value, boolean isEffective) { 1864 and(QueryMethods.column(column).likeLeft(value).when(isEffective)); 1865 return this; 1866 } 1867 1868 /** 1869 * {@code LIKE value%} 1870 * 1871 * @param column 列名, lambda 展示 1872 * @param value 值 1873 * @param isEffective 是否有效 1874 */ 1875 public <T> QueryWrapper likeLeft(LambdaGetter<T> column, Object value, boolean isEffective) { 1876 and(QueryMethods.column(column).likeLeft(value).when(isEffective)); 1877 return this; 1878 } 1879 1880 /** 1881 * {@code LIKE value%} 1882 * 1883 * @param column 列名 1884 * @param value 条件的值 1885 * @param isEffective 是否有效 1886 */ 1887 public <V> QueryWrapper likeLeft(String column, V value, Predicate<V> isEffective) { 1888 and(QueryMethods.column(column).likeLeft(value, isEffective)); 1889 return this; 1890 } 1891 1892 /** 1893 * {@code LIKE value%} 1894 * 1895 * @param column 列名, lambda 展示 1896 * @param value 值 1897 * @param isEffective 是否有效 1898 */ 1899 public <T, V> QueryWrapper likeLeft(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1900 and(QueryMethods.column(column).likeLeft(value, isEffective)); 1901 return this; 1902 } 1903 1904 1905 /** 1906 * {@code LIKE %value} 1907 * 1908 * @param column 列名 1909 * @param value 条件的值 1910 */ 1911 public QueryWrapper likeRight(String column, Object value) { 1912 and(QueryMethods.column(column).likeRight(value)); 1913 return this; 1914 } 1915 1916 /** 1917 * {@code LIKE %value} 1918 * 1919 * @param column 列名, lambda 展示 1920 * @param value 值 1921 */ 1922 public <T> QueryWrapper likeRight(LambdaGetter<T> column, Object value) { 1923 and(QueryMethods.column(column).likeRight(value)); 1924 return this; 1925 } 1926 1927 /** 1928 * {@code LIKE %value} 1929 * 1930 * @param column 列名 1931 * @param value 条件的值 1932 * @param isEffective 是否有效 1933 */ 1934 public QueryWrapper likeRight(String column, Object value, boolean isEffective) { 1935 and(QueryMethods.column(column).likeRight(value).when(isEffective)); 1936 return this; 1937 } 1938 1939 /** 1940 * {@code LIKE %value} 1941 * 1942 * @param column 列名, lambda 展示 1943 * @param value 值 1944 * @param isEffective 是否有效 1945 */ 1946 public <T> QueryWrapper likeRight(LambdaGetter<T> column, Object value, boolean isEffective) { 1947 and(QueryMethods.column(column).likeRight(value).when(isEffective)); 1948 return this; 1949 } 1950 1951 /** 1952 * {@code LIKE %value} 1953 * 1954 * @param column 列名 1955 * @param value 条件的值 1956 * @param isEffective 是否有效 1957 */ 1958 public <V> QueryWrapper likeRight(String column, V value, Predicate<V> isEffective) { 1959 and(QueryMethods.column(column).likeRight(value, isEffective)); 1960 return this; 1961 } 1962 1963 /** 1964 * {@code LIKE %value} 1965 * 1966 * @param column 列名, lambda 展示 1967 * @param value 值 1968 * @param isEffective 是否有效 1969 */ 1970 public <T, V> QueryWrapper likeRight(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 1971 and(QueryMethods.column(column).likeRight(value, isEffective)); 1972 return this; 1973 } 1974 1975 1976 /** 1977 * {@code NOT LIKE %value%} 1978 * 1979 * @param column 列名 1980 * @param value 条件的值 1981 */ 1982 public QueryWrapper notLike(String column, Object value) { 1983 and(QueryMethods.column(column).notLike(value)); 1984 return this; 1985 } 1986 1987 /** 1988 * {@code NOT LIKE %value%} 1989 * 1990 * @param column 列名, lambda 展示 1991 * @param value 值 1992 */ 1993 public <T> QueryWrapper notLike(LambdaGetter<T> column, Object value) { 1994 and(QueryMethods.column(column).notLike(value)); 1995 return this; 1996 } 1997 1998 /** 1999 * {@code NOT LIKE %value%} 2000 * 2001 * @param column 列名 2002 * @param value 条件的值 2003 * @param isEffective 是否有效 2004 */ 2005 public QueryWrapper notLike(String column, Object value, boolean isEffective) { 2006 and(QueryMethods.column(column).notLike(value).when(isEffective)); 2007 return this; 2008 } 2009 2010 /** 2011 * {@code NOT LIKE %value%} 2012 * 2013 * @param column 列名, lambda 展示 2014 * @param value 值 2015 * @param isEffective 是否有效 2016 */ 2017 public <T> QueryWrapper notLike(LambdaGetter<T> column, Object value, boolean isEffective) { 2018 and(QueryMethods.column(column).notLike(value).when(isEffective)); 2019 return this; 2020 } 2021 2022 /** 2023 * {@code NOT LIKE %value%} 2024 * 2025 * @param column 列名 2026 * @param value 条件的值 2027 * @param isEffective 是否有效 2028 */ 2029 public <V> QueryWrapper notLike(String column, V value, Predicate<V> isEffective) { 2030 and(QueryMethods.column(column).notLike(value, isEffective)); 2031 return this; 2032 } 2033 2034 /** 2035 * {@code NOT LIKE %value%} 2036 * 2037 * @param column 列名, lambda 展示 2038 * @param value 值 2039 * @param isEffective 是否有效 2040 */ 2041 public <T, V> QueryWrapper notLike(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 2042 and(QueryMethods.column(column).notLike(value, isEffective)); 2043 return this; 2044 } 2045 2046 2047 /** 2048 * {@code NOT LIKE value%} 2049 * 2050 * @param column 列名 2051 * @param value 条件的值 2052 */ 2053 public QueryWrapper notLikeLeft(String column, Object value) { 2054 and(QueryMethods.column(column).notLikeLeft(value)); 2055 return this; 2056 } 2057 2058 /** 2059 * {@code NOT LIKE value%} 2060 * 2061 * @param column 列名, lambda 展示 2062 * @param value 值 2063 */ 2064 public <T> QueryWrapper notLikeLeft(LambdaGetter<T> column, Object value) { 2065 and(QueryMethods.column(column).notLikeLeft(value)); 2066 return this; 2067 } 2068 2069 /** 2070 * {@code NOT LIKE value%} 2071 * 2072 * @param column 列名 2073 * @param value 条件的值 2074 * @param isEffective 是否有效 2075 */ 2076 public QueryWrapper notLikeLeft(String column, Object value, boolean isEffective) { 2077 and(QueryMethods.column(column).notLikeLeft(value).when(isEffective)); 2078 return this; 2079 } 2080 2081 /** 2082 * {@code NOT LIKE value%} 2083 * 2084 * @param column 列名, lambda 展示 2085 * @param value 值 2086 * @param isEffective 是否有效 2087 */ 2088 public <T> QueryWrapper notLikeLeft(LambdaGetter<T> column, Object value, boolean isEffective) { 2089 and(QueryMethods.column(column).notLikeLeft(value).when(isEffective)); 2090 return this; 2091 } 2092 2093 /** 2094 * {@code NOT LIKE value%} 2095 * 2096 * @param column 列名 2097 * @param value 条件的值 2098 * @param isEffective 是否有效 2099 */ 2100 public <V> QueryWrapper notLikeLeft(String column, V value, Predicate<V> isEffective) { 2101 and(QueryMethods.column(column).notLikeLeft(value, isEffective)); 2102 return this; 2103 } 2104 2105 /** 2106 * {@code NOT LIKE value%} 2107 * 2108 * @param column 列名, lambda 展示 2109 * @param value 值 2110 * @param isEffective 是否有效 2111 */ 2112 public <T, V> QueryWrapper notLikeLeft(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 2113 and(QueryMethods.column(column).notLikeLeft(value, isEffective)); 2114 return this; 2115 } 2116 2117 2118 /** 2119 * {@code NOT LIKE %value} 2120 * 2121 * @param column 列名 2122 * @param value 条件的值 2123 */ 2124 public QueryWrapper notLikeRight(String column, Object value) { 2125 and(QueryMethods.column(column).notLikeRight(value)); 2126 return this; 2127 } 2128 2129 /** 2130 * {@code NOT LIKE %value} 2131 * 2132 * @param column 列名, lambda 展示 2133 * @param value 值 2134 */ 2135 public <T> QueryWrapper notLikeRight(LambdaGetter<T> column, Object value) { 2136 and(QueryMethods.column(column).notLikeRight(value)); 2137 return this; 2138 } 2139 2140 /** 2141 * {@code NOT LIKE %value} 2142 * 2143 * @param column 列名 2144 * @param value 条件的值 2145 * @param isEffective 是否有效 2146 */ 2147 public QueryWrapper notLikeRight(String column, Object value, boolean isEffective) { 2148 and(QueryMethods.column(column).notLikeRight(value).when(isEffective)); 2149 return this; 2150 } 2151 2152 /** 2153 * {@code NOT LIKE %value} 2154 * 2155 * @param column 列名, lambda 展示 2156 * @param value 值 2157 * @param isEffective 是否有效 2158 */ 2159 public <T> QueryWrapper notLikeRight(LambdaGetter<T> column, Object value, boolean isEffective) { 2160 and(QueryMethods.column(column).notLikeRight(value).when(isEffective)); 2161 return this; 2162 } 2163 2164 /** 2165 * {@code NOT LIKE %value} 2166 * 2167 * @param column 列名 2168 * @param value 条件的值 2169 * @param isEffective 是否有效 2170 */ 2171 public <V> QueryWrapper notLikeRight(String column, V value, Predicate<V> isEffective) { 2172 and(QueryMethods.column(column).notLikeRight(value, isEffective)); 2173 return this; 2174 } 2175 2176 /** 2177 * {@code NOT LIKE %value} 2178 * 2179 * @param column 列名, lambda 展示 2180 * @param value 值 2181 * @param isEffective 是否有效 2182 */ 2183 public <T, V> QueryWrapper notLikeRight(LambdaGetter<T> column, V value, Predicate<V> isEffective) { 2184 and(QueryMethods.column(column).notLikeRight(value, isEffective)); 2185 return this; 2186 } 2187 2188 2189 /** 2190 * {@code IS NULL} 2191 * 2192 * @param column 列名 2193 */ 2194 public QueryWrapper isNull(String column) { 2195 and(QueryMethods.column(column).isNull()); 2196 return this; 2197 } 2198 2199 /** 2200 * {@code IS NULL} 2201 * 2202 * @param column 列名, lambda 展示 2203 */ 2204 public <T> QueryWrapper isNull(LambdaGetter<T> column) { 2205 and(QueryMethods.column(column).isNull()); 2206 return this; 2207 } 2208 2209 /** 2210 * {@code IS NULL} 2211 * 2212 * @param column 列名 2213 * @param isEffective 是否有效 2214 */ 2215 public QueryWrapper isNull(String column, boolean isEffective) { 2216 and(QueryMethods.column(column).isNull(isEffective)); 2217 return this; 2218 } 2219 2220 /** 2221 * {@code IS NULL} 2222 * 2223 * @param column 列名, lambda 展示 2224 * @param isEffective 是否有效 2225 */ 2226 public <T> QueryWrapper isNull(LambdaGetter<T> column, boolean isEffective) { 2227 and(QueryMethods.column(column).isNull(isEffective)); 2228 return this; 2229 } 2230 2231 /** 2232 * {@code IS NULL} 2233 * 2234 * @param column 列名 2235 * @param isEffective 是否有效 2236 */ 2237 public QueryWrapper isNull(String column, BooleanSupplier isEffective) { 2238 and(QueryMethods.column(column).isNull(isEffective)); 2239 return this; 2240 } 2241 2242 /** 2243 * {@code IS NULL} 2244 * 2245 * @param column 列名, lambda 展示 2246 * @param isEffective 是否有效 2247 */ 2248 public <T> QueryWrapper isNull(LambdaGetter<T> column, BooleanSupplier isEffective) { 2249 and(QueryMethods.column(column).isNull(isEffective)); 2250 return this; 2251 } 2252 2253 2254 /** 2255 * {@code IS NOT NULL} 2256 * 2257 * @param column 列名 2258 */ 2259 public QueryWrapper isNotNull(String column) { 2260 and(QueryMethods.column(column).isNotNull()); 2261 return this; 2262 } 2263 2264 /** 2265 * {@code IS NOT NULL} 2266 * 2267 * @param column 列名, lambda 展示 2268 */ 2269 public <T> QueryWrapper isNotNull(LambdaGetter<T> column) { 2270 and(QueryMethods.column(column).isNotNull()); 2271 return this; 2272 } 2273 2274 /** 2275 * {@code IS NOT NULL} 2276 * 2277 * @param column 列名 2278 * @param isEffective 是否有效 2279 */ 2280 public QueryWrapper isNotNull(String column, boolean isEffective) { 2281 and(QueryMethods.column(column).isNotNull(isEffective)); 2282 return this; 2283 } 2284 2285 /** 2286 * {@code IS NOT NULL} 2287 * 2288 * @param column 列名, lambda 展示 2289 * @param isEffective 是否有效 2290 */ 2291 public <T> QueryWrapper isNotNull(LambdaGetter<T> column, boolean isEffective) { 2292 and(QueryMethods.column(column).isNotNull(isEffective)); 2293 return this; 2294 } 2295 2296 /** 2297 * {@code IS NOT NULL} 2298 * 2299 * @param column 列名 2300 * @param isEffective 是否有效 2301 */ 2302 public QueryWrapper isNotNull(String column, BooleanSupplier isEffective) { 2303 and(QueryMethods.column(column).isNotNull(isEffective)); 2304 return this; 2305 } 2306 2307 /** 2308 * {@code IS NOT NULL} 2309 * 2310 * @param column 列名, lambda 展示 2311 * @param isEffective 是否有效 2312 */ 2313 public <T> QueryWrapper isNotNull(LambdaGetter<T> column, BooleanSupplier isEffective) { 2314 and(QueryMethods.column(column).isNotNull(isEffective)); 2315 return this; 2316 } 2317 2318 2319 ////////内部方法//////// 2320 2321 /** 2322 * 获取 queryWrapper 的参数 2323 * 在构建 sql 的时候,需要保证 where 在 having 的前面 2324 */ 2325 Object[] getAllValueArray() { 2326 2327 List<Object> withValues = null; 2328 if (with != null) { 2329 Object[] paramValues = with.getParamValues(); 2330 if (ArrayUtil.isNotEmpty(paramValues)) { 2331 withValues = new ArrayList<>(Arrays.asList(paramValues)); 2332 2333 } 2334 } 2335 2336 List<Object> columnValues = null; 2337 List<QueryColumn> selectColumns = getSelectColumns(); 2338 if (CollectionUtil.isNotEmpty(selectColumns)) { 2339 for (QueryColumn selectColumn : selectColumns) { 2340 if (selectColumn instanceof HasParamsColumn) { 2341 Object[] paramValues = ((HasParamsColumn) selectColumn).getParamValues(); 2342 if (ArrayUtil.isNotEmpty(paramValues)) { 2343 if (columnValues == null) { 2344 columnValues = new ArrayList<>(paramValues.length); 2345 } 2346 columnValues.addAll(Arrays.asList(paramValues)); 2347 } 2348 } 2349 } 2350 } 2351 2352 // select 子查询的参数:select * from (select ....) 2353 List<Object> tableValues = null; 2354 List<QueryTable> queryTables = getQueryTables(); 2355 if (CollectionUtil.isNotEmpty(queryTables)) { 2356 for (QueryTable queryTable : queryTables) { 2357 Object[] tableValueArray = queryTable.getValueArray(); 2358 if (tableValueArray.length > 0) { 2359 if (tableValues == null) { 2360 tableValues = new ArrayList<>(tableValueArray.length); 2361 } 2362 tableValues.addAll(Arrays.asList(tableValueArray)); 2363 } 2364 } 2365 } 2366 2367 // join 子查询的参数:left join (select ...) 2368 List<Object> joinValues = null; 2369 List<Join> joins = getJoins(); 2370 if (CollectionUtil.isNotEmpty(joins)) { 2371 for (Join join : joins) { 2372 QueryTable joinTable = join.getQueryTable(); 2373 Object[] valueArray = joinTable.getValueArray(); 2374 if (valueArray.length > 0) { 2375 if (joinValues == null) { 2376 joinValues = new ArrayList<>(valueArray.length); 2377 } 2378 joinValues.addAll(Arrays.asList(valueArray)); 2379 } 2380 QueryCondition onCondition = join.getOnCondition(); 2381 Object[] values = WrapperUtil.getValues(onCondition); 2382 if (values.length > 0) { 2383 if (joinValues == null) { 2384 joinValues = new ArrayList<>(values.length); 2385 } 2386 joinValues.addAll(Arrays.asList(values)); 2387 } 2388 } 2389 } 2390 2391 // where 参数 2392 Object[] whereValues = WrapperUtil.getValues(whereQueryCondition); 2393 2394 // having 参数 2395 Object[] havingValues = WrapperUtil.getValues(havingQueryCondition); 2396 2397 Object[] paramValues = ArrayUtil.concat(whereValues, havingValues); 2398 2399 // orderBy 参数 2400 if (CollectionUtil.isNotEmpty(orderBys)) { 2401 for (QueryOrderBy orderBy : orderBys) { 2402 QueryColumn orderByColumn = orderBy.queryColumn; 2403 if (orderByColumn != null && orderByColumn instanceof HasParamsColumn) { 2404 paramValues = ArrayUtil.concat(paramValues, ((HasParamsColumn) orderByColumn).getParamValues()); 2405 } 2406 } 2407 } 2408 2409 // unions 参数 2410 if (CollectionUtil.isNotEmpty(unions)) { 2411 for (UnionWrapper union : unions) { 2412 QueryWrapper queryWrapper = union.getQueryWrapper(); 2413 paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray()); 2414 } 2415 } 2416 2417 Object[] returnValues = withValues == null ? FlexConsts.EMPTY_ARRAY : withValues.toArray(); 2418 returnValues = columnValues != null ? ArrayUtil.concat(returnValues, columnValues.toArray()) : returnValues; 2419 returnValues = tableValues != null ? ArrayUtil.concat(returnValues, tableValues.toArray()) : returnValues; 2420 returnValues = joinValues != null ? ArrayUtil.concat(returnValues, joinValues.toArray()) : returnValues; 2421 returnValues = ArrayUtil.concat(returnValues, paramValues); 2422 2423 return returnValues; 2424 } 2425 2426 2427 /** 2428 * 获取 queryWrapper 的参数 2429 * 在构建 sql 的时候,需要保证 where 在 having 的前面 2430 */ 2431 Object[] getJoinValueArray() { 2432 // join 子查询的参数:left join (select ...) 2433 List<Object> joinValues = null; 2434 List<Join> joins = getJoins(); 2435 if (CollectionUtil.isNotEmpty(joins)) { 2436 for (Join join : joins) { 2437 QueryTable joinTable = join.getQueryTable(); 2438 Object[] valueArray = joinTable.getValueArray(); 2439 if (valueArray.length > 0) { 2440 if (joinValues == null) { 2441 joinValues = new ArrayList<>(valueArray.length); 2442 } 2443 joinValues.addAll(Arrays.asList(valueArray)); 2444 } 2445 QueryCondition onCondition = join.getOnCondition(); 2446 Object[] values = WrapperUtil.getValues(onCondition); 2447 if (values.length > 0) { 2448 if (joinValues == null) { 2449 joinValues = new ArrayList<>(values.length); 2450 } 2451 joinValues.addAll(Arrays.asList(values)); 2452 } 2453 } 2454 } 2455 2456 return joinValues == null ? FlexConsts.EMPTY_ARRAY : joinValues.toArray(); 2457 } 2458 2459 2460 /** 2461 * 获取 queryWrapper 的参数 2462 * 在构建 sql 的时候,需要保证 where 在 having 的前面 2463 */ 2464 Object[] getConditionValueArray() { 2465 // where 参数 2466 Object[] whereValues = WrapperUtil.getValues(whereQueryCondition); 2467 2468 // having 参数 2469 Object[] havingValues = WrapperUtil.getValues(havingQueryCondition); 2470 2471 Object[] paramValues = ArrayUtil.concat(whereValues, havingValues); 2472 2473 // unions 参数 2474 if (CollectionUtil.isNotEmpty(unions)) { 2475 for (UnionWrapper union : unions) { 2476 QueryWrapper queryWrapper = union.getQueryWrapper(); 2477 paramValues = ArrayUtil.concat(paramValues, queryWrapper.getAllValueArray()); 2478 } 2479 } 2480 2481 return paramValues; 2482 } 2483 2484 2485 List<QueryWrapper> getChildSelect() { 2486 2487 List<QueryWrapper> tableChildQuery = null; 2488 List<QueryTable> queryTables = getQueryTables(); 2489 if (CollectionUtil.isNotEmpty(queryTables)) { 2490 for (QueryTable queryTable : queryTables) { 2491 if (queryTable instanceof SelectQueryTable) { 2492 if (tableChildQuery == null) { 2493 tableChildQuery = new ArrayList<>(); 2494 } 2495 tableChildQuery.add(((SelectQueryTable) queryTable).getQueryWrapper()); 2496 } 2497 } 2498 } 2499 2500 List<QueryWrapper> whereChildQuery = WrapperUtil.getChildQueryWrapper(whereQueryCondition); 2501 List<QueryWrapper> havingChildQuery = WrapperUtil.getChildQueryWrapper(havingQueryCondition); 2502 2503 if (tableChildQuery == null && whereChildQuery.isEmpty() && havingChildQuery.isEmpty()) { 2504 return Collections.emptyList(); 2505 } 2506 2507 List<QueryWrapper> childQueryWrappers = tableChildQuery == null ? new ArrayList<>() 2508 : new ArrayList<>(tableChildQuery); 2509 childQueryWrappers.addAll(whereChildQuery); 2510 childQueryWrappers.addAll(havingChildQuery); 2511 2512 return childQueryWrappers; 2513 } 2514 2515 public String toSQL() { 2516 String sql = DialectFactory.getDialect().forSelectByQuery(this); 2517 return SqlUtil.replaceSqlParams(sql, getAllValueArray()); 2518 } 2519 2520 @Override 2521 public QueryWrapper clone() { 2522 return super.clone(); 2523 } 2524 2525}