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 018 019import com.mybatisflex.core.constant.SqlConsts; 020import com.mybatisflex.core.constant.SqlOperator; 021import com.mybatisflex.core.dialect.IDialect; 022import com.mybatisflex.core.exception.FlexExceptions; 023import com.mybatisflex.core.table.TableDef; 024import com.mybatisflex.core.util.*; 025 026import java.util.Collection; 027import java.util.List; 028import java.util.function.BiPredicate; 029import java.util.function.BooleanSupplier; 030import java.util.function.Predicate; 031 032/** 033 * 查询列,描述的是一张表的字段 034 */ 035public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<QueryCondition> { 036 037 protected QueryTable table; 038 protected String name; 039 protected String alias; 040 041 private boolean returnCopyByAsMethod = false; 042 043 044 public QueryColumn() { 045 } 046 047 public QueryColumn(String name) { 048 SqlUtil.keepColumnSafely(name); 049 this.name = StringUtil.tryTrim(name); 050 } 051 052 public QueryColumn(String tableName, String name) { 053 SqlUtil.keepColumnSafely(name); 054 this.table = new QueryTable(tableName); 055 this.name = StringUtil.tryTrim(name); 056 } 057 058 public QueryColumn(String schema, String tableName, String name) { 059 SqlUtil.keepColumnSafely(name); 060 this.table = new QueryTable(schema, tableName); 061 this.name = StringUtil.tryTrim(name); 062 } 063 064 public QueryColumn(String schema, String tableName, String name, String alias) { 065 SqlUtil.keepColumnSafely(name); 066 this.returnCopyByAsMethod = true; 067 this.table = new QueryTable(schema, tableName); 068 this.name = StringUtil.tryTrim(name); 069 this.alias = StringUtil.tryTrim(alias); 070 } 071 072 public QueryColumn(QueryTable queryTable, String name) { 073 SqlUtil.keepColumnSafely(name); 074 this.table = queryTable; 075 this.name = StringUtil.tryTrim(name); 076 } 077 078 public QueryColumn(TableDef tableDef, String name) { 079 this(tableDef, name, null); 080 } 081 082 public QueryColumn(TableDef tableDef, String name, String alias) { 083 SqlUtil.keepColumnSafely(name); 084 this.returnCopyByAsMethod = true; 085 this.table = new QueryTable(tableDef); 086 this.name = name; 087 this.alias = alias; 088 } 089 090 091 public QueryTable getTable() { 092 return table; 093 } 094 095 public void setTable(QueryTable table) { 096 this.table = table; 097 } 098 099 public String getName() { 100 return name; 101 } 102 103 public void setName(String name) { 104 this.name = name; 105 } 106 107 public String getAlias() { 108 return alias; 109 } 110 111 public void setAlias(String alias) { 112 this.alias = alias; 113 } 114 115 public <T> QueryColumn as(LambdaGetter<T> fn) { 116 return as(fn, false); 117 } 118 119 public <T> QueryColumn as(LambdaGetter<T> fn, boolean withPrefix) { 120 return as(LambdaUtil.getAliasName(fn, withPrefix)); 121 } 122 123 public QueryColumn as(String alias) { 124 SqlUtil.keepColumnSafely(alias); 125 if (returnCopyByAsMethod) { 126 QueryColumn newColumn = new QueryColumn(); 127 newColumn.table = this.table; 128 newColumn.name = this.name; 129 newColumn.alias = alias; 130 return newColumn; 131 } else { 132 this.alias = alias; 133 return this; 134 } 135 } 136 137 138 // query methods /////// 139 140 @Override 141 public QueryCondition eq(Object value) { 142 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 143 return QueryCondition.createEmpty(); 144 } 145 return QueryCondition.create(this, SqlOperator.EQUALS, value); 146 } 147 148 @Override 149 public QueryCondition eq(Object value, boolean isEffective) { 150 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 151 return QueryCondition.createEmpty(); 152 } 153 return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective); 154 } 155 156 @Override 157 public QueryCondition eq(Object value, BooleanSupplier isEffective) { 158 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 159 return QueryCondition.createEmpty(); 160 } 161 return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective); 162 } 163 164 @Override 165 public <T> QueryCondition eq(T value, Predicate<T> isEffective) { 166 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 167 return QueryCondition.createEmpty(); 168 } 169 return QueryCondition.create(this, SqlOperator.EQUALS, value).when(isEffective.test(value)); 170 } 171 172 @Override 173 public QueryCondition ne(Object value) { 174 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 175 return QueryCondition.createEmpty(); 176 } 177 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value); 178 } 179 180 @Override 181 public QueryCondition ne(Object value, boolean isEffective) { 182 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 183 return QueryCondition.createEmpty(); 184 } 185 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective); 186 } 187 188 @Override 189 public QueryCondition ne(Object value, BooleanSupplier isEffective) { 190 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 191 return QueryCondition.createEmpty(); 192 } 193 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective); 194 } 195 196 @Override 197 public <T> QueryCondition ne(T value, Predicate<T> isEffective) { 198 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 199 return QueryCondition.createEmpty(); 200 } 201 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value).when(isEffective.test(value)); 202 } 203 204 @Override 205 public QueryCondition gt(Object value) { 206 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 207 return QueryCondition.createEmpty(); 208 } 209 return QueryCondition.create(this, SqlOperator.GT, value); 210 } 211 212 @Override 213 public QueryCondition gt(Object value, boolean isEffective) { 214 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 215 return QueryCondition.createEmpty(); 216 } 217 return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective); 218 } 219 220 @Override 221 public QueryCondition gt(Object value, BooleanSupplier isEffective) { 222 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 223 return QueryCondition.createEmpty(); 224 } 225 return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective); 226 } 227 228 @Override 229 public <T> QueryCondition gt(T value, Predicate<T> isEffective) { 230 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 231 return QueryCondition.createEmpty(); 232 } 233 return QueryCondition.create(this, SqlOperator.GT, value).when(isEffective.test(value)); 234 } 235 236 @Override 237 public QueryCondition ge(Object value) { 238 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 239 return QueryCondition.createEmpty(); 240 } 241 return QueryCondition.create(this, SqlOperator.GE, value); 242 } 243 244 @Override 245 public QueryCondition ge(Object value, boolean isEffective) { 246 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 247 return QueryCondition.createEmpty(); 248 } 249 return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective); 250 } 251 252 @Override 253 public QueryCondition ge(Object value, BooleanSupplier isEffective) { 254 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 255 return QueryCondition.createEmpty(); 256 } 257 return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective); 258 } 259 260 @Override 261 public <T> QueryCondition ge(T value, Predicate<T> isEffective) { 262 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 263 return QueryCondition.createEmpty(); 264 } 265 return QueryCondition.create(this, SqlOperator.GE, value).when(isEffective.test(value)); 266 } 267 268 @Override 269 public QueryCondition lt(Object value) { 270 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 271 return QueryCondition.createEmpty(); 272 } 273 return QueryCondition.create(this, SqlOperator.LT, value); 274 } 275 276 @Override 277 public QueryCondition lt(Object value, boolean isEffective) { 278 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 279 return QueryCondition.createEmpty(); 280 } 281 return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective); 282 } 283 284 @Override 285 public QueryCondition lt(Object value, BooleanSupplier isEffective) { 286 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 287 return QueryCondition.createEmpty(); 288 } 289 return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective); 290 } 291 292 @Override 293 public <T> QueryCondition lt(T value, Predicate<T> isEffective) { 294 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 295 return QueryCondition.createEmpty(); 296 } 297 return QueryCondition.create(this, SqlOperator.LT, value).when(isEffective.test(value)); 298 } 299 300 @Override 301 public QueryCondition le(Object value) { 302 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 303 return QueryCondition.createEmpty(); 304 } 305 return QueryCondition.create(this, SqlOperator.LE, value); 306 } 307 308 @Override 309 public QueryCondition le(Object value, boolean isEffective) { 310 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 311 return QueryCondition.createEmpty(); 312 } 313 return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective); 314 } 315 316 @Override 317 public QueryCondition le(Object value, BooleanSupplier isEffective) { 318 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 319 return QueryCondition.createEmpty(); 320 } 321 return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective); 322 } 323 324 @Override 325 public <T> QueryCondition le(T value, Predicate<T> isEffective) { 326 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 327 return QueryCondition.createEmpty(); 328 } 329 return QueryCondition.create(this, SqlOperator.LE, value).when(isEffective.test(value)); 330 } 331 332 @Override 333 public QueryCondition in(Object... value) { 334 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 335 return QueryCondition.createEmpty(); 336 } 337 // IN 里面只有一个值的情况 338 if (value.length == 1) { 339 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 340 return QueryCondition.createEmpty(); 341 } 342 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 343 return QueryCondition.create(this, SqlOperator.EQUALS, value[0]); 344 } 345 } 346 return QueryCondition.create(this, SqlConsts.IN, value); 347 } 348 349 @Override 350 public QueryCondition in(Object[] value, boolean isEffective) { 351 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 352 return QueryCondition.createEmpty(); 353 } 354 // IN 里面只有一个值的情况 355 if (value.length == 1) { 356 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 357 return QueryCondition.createEmpty(); 358 } 359 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 360 return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective); 361 } 362 } 363 return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective); 364 } 365 366 @Override 367 public QueryCondition in(Object[] value, BooleanSupplier isEffective) { 368 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 369 return QueryCondition.createEmpty(); 370 } 371 // IN 里面只有一个值的情况 372 if (value.length == 1) { 373 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 374 return QueryCondition.createEmpty(); 375 } 376 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 377 return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective); 378 } 379 } 380 return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective); 381 } 382 383 @Override 384 public <T> QueryCondition in(T[] value, Predicate<T[]> isEffective) { 385 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 386 return QueryCondition.createEmpty(); 387 } 388 // IN 里面只有一个值的情况 389 if (value.length == 1) { 390 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 391 return QueryCondition.createEmpty(); 392 } 393 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 394 return QueryCondition.create(this, SqlOperator.EQUALS, value[0]).when(isEffective.test(value)); 395 } 396 } 397 return QueryCondition.create(this, SqlConsts.IN, value).when(isEffective.test(value)); 398 } 399 400 @Override 401 public QueryCondition in(Collection<?> value) { 402 if (value == null || value.isEmpty()) { 403 return QueryCondition.createEmpty(); 404 } 405 return in(value.toArray()); 406 } 407 408 @Override 409 public QueryCondition in(Collection<?> value, boolean isEffective) { 410 if (value == null || value.isEmpty()) { 411 return QueryCondition.createEmpty(); 412 } 413 return in(value.toArray()).when(isEffective); 414 } 415 416 @Override 417 public QueryCondition in(Collection<?> value, BooleanSupplier isEffective) { 418 if (value == null || value.isEmpty()) { 419 return QueryCondition.createEmpty(); 420 } 421 return in(value.toArray()).when(isEffective); 422 } 423 424 @Override 425 public <T extends Collection<?>> QueryCondition in(T value, Predicate<T> isEffective) { 426 if (value == null || value.isEmpty()) { 427 return QueryCondition.createEmpty(); 428 } 429 return in(value.toArray()).when(isEffective.test(value)); 430 } 431 432 @Override 433 public QueryCondition in(QueryWrapper queryWrapper) { 434 if (queryWrapper == null) { 435 return QueryCondition.createEmpty(); 436 } 437 return QueryCondition.create(this, SqlOperator.IN, queryWrapper); 438 } 439 440 @Override 441 public QueryCondition in(QueryWrapper queryWrapper, boolean isEffective) { 442 if (queryWrapper == null) { 443 return QueryCondition.createEmpty(); 444 } 445 return QueryCondition.create(this, SqlOperator.IN, queryWrapper).when(isEffective); 446 } 447 448 @Override 449 public QueryCondition in(QueryWrapper queryWrapper, BooleanSupplier isEffective) { 450 if (queryWrapper == null) { 451 return QueryCondition.createEmpty(); 452 } 453 return QueryCondition.create(this, SqlOperator.IN, queryWrapper).when(isEffective); 454 } 455 456 @Override 457 public QueryCondition notIn(Object... value) { 458 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 459 return QueryCondition.createEmpty(); 460 } 461 // NOT IN 里面只有一个值的情况 462 if (value.length == 1) { 463 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 464 return QueryCondition.createEmpty(); 465 } 466 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 467 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]); 468 } 469 } 470 return QueryCondition.create(this, SqlConsts.NOT_IN, value); 471 } 472 473 @Override 474 public QueryCondition notIn(Object[] value, boolean isEffective) { 475 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 476 return QueryCondition.createEmpty(); 477 } 478 // NOT IN 里面只有一个值的情况 479 if (value.length == 1) { 480 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 481 return QueryCondition.createEmpty(); 482 } 483 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 484 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective); 485 } 486 } 487 return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective); 488 } 489 490 @Override 491 public QueryCondition notIn(Object[] value, BooleanSupplier isEffective) { 492 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 493 return QueryCondition.createEmpty(); 494 } 495 // NOT IN 里面只有一个值的情况 496 if (value.length == 1) { 497 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 498 return QueryCondition.createEmpty(); 499 } 500 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 501 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective); 502 } 503 } 504 return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective); 505 } 506 507 @Override 508 public <T> QueryCondition notIn(T[] value, Predicate<T[]> isEffective) { 509 if (QueryColumnBehavior.shouldIgnoreValue(value) || value.length == 0) { 510 return QueryCondition.createEmpty(); 511 } 512 // NOT IN 里面只有一个值的情况 513 if (value.length == 1) { 514 if (QueryColumnBehavior.shouldIgnoreValue(value[0])) { 515 return QueryCondition.createEmpty(); 516 } 517 if (QueryColumnBehavior.isSmartConvertInToEquals()) { 518 return QueryCondition.create(this, SqlOperator.NOT_EQUALS, value[0]).when(isEffective.test(value)); 519 } 520 } 521 return QueryCondition.create(this, SqlConsts.NOT_IN, value).when(isEffective.test(value)); 522 } 523 524 @Override 525 public QueryCondition notIn(Collection<?> value) { 526 if (value == null || value.isEmpty()) { 527 return QueryCondition.createEmpty(); 528 } 529 return notIn(value.toArray()); 530 } 531 532 @Override 533 public QueryCondition notIn(Collection<?> value, boolean isEffective) { 534 if (value == null || value.isEmpty()) { 535 return QueryCondition.createEmpty(); 536 } 537 return notIn(value.toArray()).when(isEffective); 538 } 539 540 @Override 541 public QueryCondition notIn(Collection<?> value, BooleanSupplier isEffective) { 542 if (value == null || value.isEmpty()) { 543 return QueryCondition.createEmpty(); 544 } 545 return notIn(value.toArray()).when(isEffective); 546 } 547 548 @Override 549 public <T extends Collection<?>> QueryCondition notIn(T value, Predicate<T> isEffective) { 550 if (value == null || value.isEmpty()) { 551 return QueryCondition.createEmpty(); 552 } 553 return notIn(value.toArray()).when(isEffective.test(value)); 554 } 555 556 @Override 557 public QueryCondition notIn(QueryWrapper queryWrapper) { 558 if (queryWrapper == null) { 559 return QueryCondition.createEmpty(); 560 } 561 return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper); 562 } 563 564 @Override 565 public QueryCondition notIn(QueryWrapper queryWrapper, boolean isEffective) { 566 if (queryWrapper == null) { 567 return QueryCondition.createEmpty(); 568 } 569 return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper).when(isEffective); 570 } 571 572 @Override 573 public QueryCondition notIn(QueryWrapper queryWrapper, BooleanSupplier isEffective) { 574 if (queryWrapper == null) { 575 return QueryCondition.createEmpty(); 576 } 577 return QueryCondition.create(this, SqlOperator.NOT_IN, queryWrapper).when(isEffective); 578 } 579 580 @Override 581 public QueryCondition between(Object start, Object end) { 582 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 583 return QueryCondition.createEmpty(); 584 } 585 return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}); 586 } 587 588 @Override 589 public QueryCondition between(Object start, Object end, boolean isEffective) { 590 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 591 return QueryCondition.createEmpty(); 592 } 593 return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective); 594 } 595 596 @Override 597 public QueryCondition between(Object start, Object end, BooleanSupplier isEffective) { 598 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 599 return QueryCondition.createEmpty(); 600 } 601 return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective); 602 } 603 604 @Override 605 public <S, E> QueryCondition between(S start, E end, BiPredicate<S, E> isEffective) { 606 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 607 return QueryCondition.createEmpty(); 608 } 609 return QueryCondition.create(this, SqlOperator.BETWEEN, new Object[]{start, end}).when(isEffective.test(start, end)); 610 } 611 612 @Override 613 public QueryCondition notBetween(Object start, Object end) { 614 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 615 return QueryCondition.createEmpty(); 616 } 617 return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}); 618 } 619 620 @Override 621 public QueryCondition notBetween(Object start, Object end, boolean isEffective) { 622 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 623 return QueryCondition.createEmpty(); 624 } 625 return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective); 626 } 627 628 @Override 629 public QueryCondition notBetween(Object start, Object end, BooleanSupplier isEffective) { 630 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 631 return QueryCondition.createEmpty(); 632 } 633 return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective); 634 } 635 636 @Override 637 public <S, E> QueryCondition notBetween(S start, E end, BiPredicate<S, E> isEffective) { 638 if (QueryColumnBehavior.shouldIgnoreValue(start) || QueryColumnBehavior.shouldIgnoreValue(end)) { 639 return QueryCondition.createEmpty(); 640 } 641 return QueryCondition.create(this, SqlOperator.NOT_BETWEEN, new Object[]{start, end}).when(isEffective.test(start, end)); 642 } 643 644 @Override 645 public QueryCondition like(Object value) { 646 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 647 return QueryCondition.createEmpty(); 648 } 649 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%"); 650 } 651 652 @Override 653 public QueryCondition like(Object value, boolean isEffective) { 654 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 655 return QueryCondition.createEmpty(); 656 } 657 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective); 658 } 659 660 @Override 661 public QueryCondition like(Object value, BooleanSupplier isEffective) { 662 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 663 return QueryCondition.createEmpty(); 664 } 665 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective); 666 } 667 668 @Override 669 public <T> QueryCondition like(T value, Predicate<T> isEffective) { 670 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 671 return QueryCondition.createEmpty(); 672 } 673 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value + "%").when(isEffective.test(value)); 674 } 675 676 @Override 677 public QueryCondition likeLeft(Object value) { 678 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 679 return QueryCondition.createEmpty(); 680 } 681 return QueryCondition.create(this, SqlOperator.LIKE, value + "%"); 682 } 683 684 @Override 685 public QueryCondition likeLeft(Object value, boolean isEffective) { 686 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 687 return QueryCondition.createEmpty(); 688 } 689 return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective); 690 } 691 692 @Override 693 public QueryCondition likeLeft(Object value, BooleanSupplier isEffective) { 694 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 695 return QueryCondition.createEmpty(); 696 } 697 return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective); 698 } 699 700 @Override 701 public <T> QueryCondition likeLeft(T value, Predicate<T> isEffective) { 702 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 703 return QueryCondition.createEmpty(); 704 } 705 return QueryCondition.create(this, SqlOperator.LIKE, value + "%").when(isEffective.test(value)); 706 } 707 708 @Override 709 public QueryCondition likeRight(Object value) { 710 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 711 return QueryCondition.createEmpty(); 712 } 713 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value); 714 } 715 716 @Override 717 public QueryCondition likeRight(Object value, boolean isEffective) { 718 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 719 return QueryCondition.createEmpty(); 720 } 721 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective); 722 } 723 724 @Override 725 public QueryCondition likeRight(Object value, BooleanSupplier isEffective) { 726 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 727 return QueryCondition.createEmpty(); 728 } 729 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective); 730 } 731 732 @Override 733 public <T> QueryCondition likeRight(T value, Predicate<T> isEffective) { 734 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 735 return QueryCondition.createEmpty(); 736 } 737 return QueryCondition.create(this, SqlOperator.LIKE, "%" + value).when(isEffective.test(value)); 738 } 739 740 /** 741 * {@code LIKE value} 742 */ 743 public QueryCondition likeRaw(Object value) { 744 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 745 return QueryCondition.createEmpty(); 746 } 747 return likeRaw(value, true); 748 } 749 750 /** 751 * {@code LIKE value} 752 */ 753 public QueryCondition likeRaw(Object value, boolean isEffective) { 754 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 755 return QueryCondition.createEmpty(); 756 } 757 return QueryCondition.create(this, SqlOperator.LIKE, value).when(isEffective); 758 } 759 760 /** 761 * {@code LIKE value} 762 */ 763 public QueryCondition likeRaw(Object value, BooleanSupplier isEffective) { 764 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 765 return QueryCondition.createEmpty(); 766 } 767 return likeRaw(value, isEffective.getAsBoolean()); 768 } 769 770 /** 771 * {@code LIKE value} 772 */ 773 public <T> QueryCondition likeRaw(T value, Predicate<T> isEffective) { 774 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 775 return QueryCondition.createEmpty(); 776 } 777 return likeRaw(value, isEffective.test(value)); 778 } 779 780 @Override 781 public QueryCondition notLike(Object value) { 782 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 783 return QueryCondition.createEmpty(); 784 } 785 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%"); 786 } 787 788 @Override 789 public QueryCondition notLike(Object value, boolean isEffective) { 790 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 791 return QueryCondition.createEmpty(); 792 } 793 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective); 794 } 795 796 @Override 797 public QueryCondition notLike(Object value, BooleanSupplier isEffective) { 798 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 799 return QueryCondition.createEmpty(); 800 } 801 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective); 802 } 803 804 @Override 805 public <T> QueryCondition notLike(T value, Predicate<T> isEffective) { 806 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 807 return QueryCondition.createEmpty(); 808 } 809 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value + "%").when(isEffective.test(value)); 810 } 811 812 @Override 813 public QueryCondition notLikeLeft(Object value) { 814 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 815 return QueryCondition.createEmpty(); 816 } 817 return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%"); 818 } 819 820 @Override 821 public QueryCondition notLikeLeft(Object value, boolean isEffective) { 822 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 823 return QueryCondition.createEmpty(); 824 } 825 return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective); 826 } 827 828 @Override 829 public QueryCondition notLikeLeft(Object value, BooleanSupplier isEffective) { 830 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 831 return QueryCondition.createEmpty(); 832 } 833 return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective); 834 } 835 836 @Override 837 public <T> QueryCondition notLikeLeft(T value, Predicate<T> isEffective) { 838 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 839 return QueryCondition.createEmpty(); 840 } 841 return QueryCondition.create(this, SqlOperator.NOT_LIKE, value + "%").when(isEffective.test(value)); 842 } 843 844 @Override 845 public QueryCondition notLikeRight(Object value) { 846 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 847 return QueryCondition.createEmpty(); 848 } 849 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value); 850 } 851 852 @Override 853 public QueryCondition notLikeRight(Object value, boolean isEffective) { 854 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 855 return QueryCondition.createEmpty(); 856 } 857 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective); 858 } 859 860 @Override 861 public QueryCondition notLikeRight(Object value, BooleanSupplier isEffective) { 862 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 863 return QueryCondition.createEmpty(); 864 } 865 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective); 866 } 867 868 @Override 869 public <T> QueryCondition notLikeRight(T value, Predicate<T> isEffective) { 870 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 871 return QueryCondition.createEmpty(); 872 } 873 return QueryCondition.create(this, SqlOperator.NOT_LIKE, "%" + value).when(isEffective.test(value)); 874 } 875 876 /** 877 * {@code NOT LIKE value} 878 */ 879 public QueryCondition notLikeRaw(Object value) { 880 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 881 return QueryCondition.createEmpty(); 882 } 883 return likeRaw(value, true); 884 } 885 886 /** 887 * {@code NOT LIKE value} 888 */ 889 public QueryCondition notLikeRaw(Object value, boolean isEffective) { 890 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 891 return QueryCondition.createEmpty(); 892 } 893 return QueryCondition.create(this, SqlOperator.NOT_LIKE, value).when(isEffective); 894 } 895 896 /** 897 * {@code NOT LIKE value} 898 */ 899 public QueryCondition notLikeRaw(Object value, BooleanSupplier isEffective) { 900 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 901 return QueryCondition.createEmpty(); 902 } 903 return likeRaw(value, isEffective.getAsBoolean()); 904 } 905 906 /** 907 * {@code NOT LIKE value} 908 */ 909 public <T> QueryCondition notLikeRaw(T value, Predicate<T> isEffective) { 910 if (QueryColumnBehavior.shouldIgnoreValue(value)) { 911 return QueryCondition.createEmpty(); 912 } 913 return likeRaw(value, isEffective.test(value)); 914 } 915 916 @Override 917 public QueryCondition isNull(boolean isEffective) { 918 return QueryCondition.create(this, SqlOperator.IS_NULL, null).when(isEffective); 919 } 920 921 @Override 922 public QueryCondition isNotNull(boolean isEffective) { 923 return QueryCondition.create(this, SqlOperator.IS_NOT_NULL, null).when(isEffective); 924 } 925 926 927 ////order by //// 928 public QueryOrderBy asc() { 929 return new QueryOrderBy(this, SqlConsts.ASC); 930 } 931 932 933 public QueryOrderBy desc() { 934 return new QueryOrderBy(this, SqlConsts.DESC); 935 } 936 937 938 // 运算 加减乘除 + - * / 939 public QueryColumn add(QueryColumn queryColumn) { 940 return new ArithmeticQueryColumn(this).add(queryColumn); 941 } 942 943 public QueryColumn add(Number number) { 944 return new ArithmeticQueryColumn(this).add(number); 945 } 946 947 public QueryColumn subtract(QueryColumn queryColumn) { 948 return new ArithmeticQueryColumn(this).subtract(queryColumn); 949 } 950 951 public QueryColumn subtract(Number number) { 952 return new ArithmeticQueryColumn(this).subtract(number); 953 } 954 955 public QueryColumn multiply(QueryColumn queryColumn) { 956 return new ArithmeticQueryColumn(this).multiply(queryColumn); 957 } 958 959 public QueryColumn multiply(Number number) { 960 return new ArithmeticQueryColumn(this).multiply(number); 961 } 962 963 public QueryColumn divide(QueryColumn queryColumn) { 964 return new ArithmeticQueryColumn(this).divide(queryColumn); 965 } 966 967 public QueryColumn divide(Number number) { 968 return new ArithmeticQueryColumn(this).divide(number); 969 } 970 971 972 String toConditionSql(List<QueryTable> queryTables, IDialect dialect) { 973 QueryTable selectTable = getSelectTable(queryTables, table); 974 if (selectTable == null) { 975 return dialect.wrap(name); 976 } else { 977 if (StringUtil.isNotBlank(selectTable.alias)) { 978 return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name); 979 } else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) { 980 String realTable = dialect.getRealTable(selectTable.getName()); 981 return dialect.wrap(dialect.getRealSchema(selectTable.schema, realTable)) + SqlConsts.REFERENCE + dialect.wrap(realTable) 982 + SqlConsts.REFERENCE + dialect.wrap(name); 983 } else if (StringUtil.isNotBlank(selectTable.getName())) { 984 return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name); 985 } else { 986 return dialect.wrap(name); 987 } 988 } 989 } 990 991 992 String toSelectSql(List<QueryTable> queryTables, IDialect dialect) { 993 return toConditionSql(queryTables, dialect) + WrapperUtil.buildColumnAlias(alias, dialect); 994 } 995 996 997 QueryTable getSelectTable(List<QueryTable> queryTables, QueryTable selfTable) { 998 //未查询任何表 999 if (queryTables == null || queryTables.isEmpty()) { 1000 return null; 1001 } 1002 1003 if (selfTable != null && StringUtil.isNotBlank(selfTable.alias)) { 1004 return selfTable; 1005 } 1006 1007 if (queryTables.size() == 1 && queryTables.get(0).isSameTable(selfTable)) { 1008 //ignore table 1009 return null; 1010 } 1011 1012 if (CollectionUtil.isEmpty(queryTables)) { 1013 return selfTable; 1014 } 1015 1016 if (selfTable == null && queryTables.size() == 1) { 1017 return queryTables.get(0); 1018 } 1019 1020 for (QueryTable table : queryTables) { 1021 if (table.isSameTable(selfTable)) { 1022 return table; 1023 } 1024 } 1025 return selfTable; 1026 } 1027 1028 1029 @Override 1030 public String toString() { 1031 return "QueryColumn{" + 1032 "table=" + table + 1033 ", name='" + name + '\'' + 1034 ", alias='" + alias + '\'' + 1035 '}'; 1036 } 1037 1038 1039 @Override 1040 public QueryColumn clone() { 1041 try { 1042 QueryColumn clone = (QueryColumn) super.clone(); 1043 // deep clone ... 1044 clone.table = ObjectUtil.clone(this.table); 1045 return clone; 1046 } catch (CloneNotSupportedException e) { 1047 throw FlexExceptions.wrap(e); 1048 } 1049 } 1050 1051}