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