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