001/* 002 * Copyright (c) 2022-2025, 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.activerecord.query; 017 018import com.mybatisflex.core.constant.SqlConnector; 019import com.mybatisflex.core.query.CPI; 020import com.mybatisflex.core.query.Conditional; 021import com.mybatisflex.core.query.QueryColumn; 022import com.mybatisflex.core.query.QueryCondition; 023import com.mybatisflex.core.query.QueryWrapper; 024import com.mybatisflex.core.util.LambdaGetter; 025import com.mybatisflex.core.util.LambdaUtil; 026 027import java.util.Collection; 028import java.util.function.BiPredicate; 029import java.util.function.BooleanSupplier; 030import java.util.function.Predicate; 031 032/** 033 * Lambda 条件构建器。 034 * 035 * @author 王帅 036 * @since 2023-07-24 037 */ 038public class WhereBuilder<R extends QueryModel<R>> implements Conditional<R> { 039 040 private final R queryModel; 041 private final QueryColumn queryColumn; 042 private final SqlConnector connector; 043 044 public WhereBuilder(R queryModel, QueryColumn queryColumn, SqlConnector connector) { 045 this.queryModel = queryModel; 046 this.queryColumn = queryColumn; 047 this.connector = connector; 048 } 049 050 private void addWhereQueryCondition(QueryCondition queryCondition) { 051 CPI.addWhereQueryCondition(queryModel.queryWrapper(), queryCondition, connector); 052 } 053 054 @Override 055 public R eq(Object value) { 056 addWhereQueryCondition(queryColumn.eq(value)); 057 return queryModel; 058 } 059 060 @Override 061 public R eq(Object value, boolean isEffective) { 062 addWhereQueryCondition(queryColumn.eq(value, isEffective)); 063 return queryModel; 064 } 065 066 @Override 067 public R eq(Object value, BooleanSupplier isEffective) { 068 addWhereQueryCondition(queryColumn.eq(value, isEffective)); 069 return queryModel; 070 } 071 072 @Override 073 public <T> R eq(T value, Predicate<T> isEffective) { 074 addWhereQueryCondition(queryColumn.eq(value, isEffective)); 075 return queryModel; 076 } 077 078 /** 079 * 等于 {@code =} 080 */ 081 public <T> R eq(LambdaGetter<T> value) { 082 return eq(LambdaUtil.getQueryColumn(value), true); 083 } 084 085 /** 086 * 等于 {@code =} 087 */ 088 public <T> R eq(LambdaGetter<T> value, boolean isEffective) { 089 return eq(LambdaUtil.getQueryColumn(value), isEffective); 090 } 091 092 /** 093 * 等于 {@code =} 094 */ 095 public <T> R eq(LambdaGetter<T> value, BooleanSupplier isEffective) { 096 return eq(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 097 } 098 099 @Override 100 public R ne(Object value) { 101 addWhereQueryCondition(queryColumn.ne(value)); 102 return queryModel; 103 } 104 105 @Override 106 public R ne(Object value, boolean isEffective) { 107 addWhereQueryCondition(queryColumn.ne(value, isEffective)); 108 return queryModel; 109 } 110 111 @Override 112 public R ne(Object value, BooleanSupplier isEffective) { 113 addWhereQueryCondition(queryColumn.ne(value, isEffective)); 114 return queryModel; 115 } 116 117 @Override 118 public <T> R ne(T value, Predicate<T> isEffective) { 119 addWhereQueryCondition(queryColumn.ne(value, isEffective)); 120 return queryModel; 121 } 122 123 /** 124 * 不等于 {@code !=} 125 */ 126 public <T> R ne(LambdaGetter<T> value) { 127 return ne(LambdaUtil.getQueryColumn(value), true); 128 } 129 130 /** 131 * 不等于 {@code !=} 132 */ 133 public <T> R ne(LambdaGetter<T> value, boolean isEffective) { 134 return ne(LambdaUtil.getQueryColumn(value), isEffective); 135 } 136 137 /** 138 * 不等于 {@code !=} 139 */ 140 public <T> R ne(LambdaGetter<T> value, BooleanSupplier isEffective) { 141 return ne(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 142 } 143 144 @Override 145 public R gt(Object value) { 146 addWhereQueryCondition(queryColumn.gt(value)); 147 return queryModel; 148 } 149 150 @Override 151 public R gt(Object value, boolean isEffective) { 152 addWhereQueryCondition(queryColumn.gt(value, isEffective)); 153 return queryModel; 154 } 155 156 @Override 157 public R gt(Object value, BooleanSupplier isEffective) { 158 addWhereQueryCondition(queryColumn.gt(value, isEffective)); 159 return queryModel; 160 } 161 162 @Override 163 public <T> R gt(T value, Predicate<T> isEffective) { 164 addWhereQueryCondition(queryColumn.gt(value, isEffective)); 165 return queryModel; 166 } 167 168 /** 169 * 大于 {@code >} 170 */ 171 public <T> R gt(LambdaGetter<T> value) { 172 return gt(LambdaUtil.getQueryColumn(value), true); 173 } 174 175 /** 176 * 大于 {@code >} 177 */ 178 public <T> R gt(LambdaGetter<T> value, boolean isEffective) { 179 return gt(LambdaUtil.getQueryColumn(value), isEffective); 180 } 181 182 /** 183 * 大于 {@code >} 184 */ 185 public <T> R gt(LambdaGetter<T> value, BooleanSupplier isEffective) { 186 return gt(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 187 } 188 189 @Override 190 public R ge(Object value) { 191 addWhereQueryCondition(queryColumn.ge(value)); 192 return queryModel; 193 } 194 195 @Override 196 public R ge(Object value, boolean isEffective) { 197 addWhereQueryCondition(queryColumn.ge(value, isEffective)); 198 return queryModel; 199 } 200 201 @Override 202 public R ge(Object value, BooleanSupplier isEffective) { 203 addWhereQueryCondition(queryColumn.ge(value, isEffective)); 204 return queryModel; 205 } 206 207 @Override 208 public <T> R ge(T value, Predicate<T> isEffective) { 209 addWhereQueryCondition(queryColumn.ge(value, isEffective)); 210 return queryModel; 211 } 212 213 /** 214 * 大于等于 {@code >=} 215 */ 216 public <T> R ge(LambdaGetter<T> value) { 217 return ge(LambdaUtil.getQueryColumn(value), true); 218 } 219 220 /** 221 * 大于等于 {@code >=} 222 */ 223 public <T> R ge(LambdaGetter<T> value, boolean isEffective) { 224 return ge(LambdaUtil.getQueryColumn(value), isEffective); 225 } 226 227 /** 228 * 大于等于 {@code >=} 229 */ 230 public <T> R ge(LambdaGetter<T> value, BooleanSupplier isEffective) { 231 return ge(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 232 } 233 234 @Override 235 public R lt(Object value) { 236 addWhereQueryCondition(queryColumn.lt(value)); 237 return queryModel; 238 } 239 240 @Override 241 public R lt(Object value, boolean isEffective) { 242 addWhereQueryCondition(queryColumn.lt(value, isEffective)); 243 return queryModel; 244 } 245 246 @Override 247 public R lt(Object value, BooleanSupplier isEffective) { 248 addWhereQueryCondition(queryColumn.lt(value, isEffective)); 249 return queryModel; 250 } 251 252 @Override 253 public <T> R lt(T value, Predicate<T> isEffective) { 254 addWhereQueryCondition(queryColumn.lt(value, isEffective)); 255 return queryModel; 256 } 257 258 /** 259 * 小于 {@code <} 260 */ 261 public <T> R lt(LambdaGetter<T> value) { 262 return lt(LambdaUtil.getQueryColumn(value), true); 263 } 264 265 /** 266 * 小于 {@code <} 267 */ 268 public <T> R lt(LambdaGetter<T> value, boolean isEffective) { 269 return lt(LambdaUtil.getQueryColumn(value), isEffective); 270 } 271 272 /** 273 * 小于 {@code <} 274 */ 275 public <T> R lt(LambdaGetter<T> value, BooleanSupplier isEffective) { 276 return lt(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 277 } 278 279 @Override 280 public R le(Object value) { 281 addWhereQueryCondition(queryColumn.le(value)); 282 return queryModel; 283 } 284 285 @Override 286 public R le(Object value, boolean isEffective) { 287 addWhereQueryCondition(queryColumn.le(value, isEffective)); 288 return queryModel; 289 } 290 291 @Override 292 public R le(Object value, BooleanSupplier isEffective) { 293 addWhereQueryCondition(queryColumn.le(value, isEffective)); 294 return queryModel; 295 } 296 297 @Override 298 public <T> R le(T value, Predicate<T> isEffective) { 299 addWhereQueryCondition(queryColumn.le(value, isEffective)); 300 return queryModel; 301 } 302 303 /** 304 * 小于等于 {@code <=} 305 */ 306 public <T> R le(LambdaGetter<T> value) { 307 return le(LambdaUtil.getQueryColumn(value), true); 308 } 309 310 /** 311 * 小于等于 {@code <=} 312 */ 313 public <T> R le(LambdaGetter<T> value, boolean isEffective) { 314 return le(LambdaUtil.getQueryColumn(value), isEffective); 315 } 316 317 /** 318 * 小于等于 {@code <=} 319 */ 320 public <T> R le(LambdaGetter<T> value, BooleanSupplier isEffective) { 321 return le(LambdaUtil.getQueryColumn(value), isEffective.getAsBoolean()); 322 } 323 324 @Override 325 public R in(Object... value) { 326 addWhereQueryCondition(queryColumn.in(value)); 327 return queryModel; 328 } 329 330 @Override 331 public R in(Object[] value, boolean isEffective) { 332 addWhereQueryCondition(queryColumn.in(value, isEffective)); 333 return queryModel; 334 } 335 336 @Override 337 public R in(Object[] value, BooleanSupplier isEffective) { 338 addWhereQueryCondition(queryColumn.in(value, isEffective)); 339 return queryModel; 340 } 341 342 @Override 343 public <T> R in(T[] value, Predicate<T[]> isEffective) { 344 addWhereQueryCondition(queryColumn.in(value, isEffective)); 345 return queryModel; 346 } 347 348 @Override 349 public R in(Collection<?> value) { 350 addWhereQueryCondition(queryColumn.in(value)); 351 return queryModel; 352 } 353 354 @Override 355 public R in(Collection<?> value, boolean isEffective) { 356 addWhereQueryCondition(queryColumn.in(value, isEffective)); 357 return queryModel; 358 } 359 360 @Override 361 public R in(Collection<?> value, BooleanSupplier isEffective) { 362 addWhereQueryCondition(queryColumn.in(value, isEffective)); 363 return queryModel; 364 } 365 366 @Override 367 public <T extends Collection<?>> R in(T value, Predicate<T> isEffective) { 368 addWhereQueryCondition(queryColumn.in(value, isEffective)); 369 return queryModel; 370 } 371 372 @Override 373 public R in(QueryWrapper queryWrapper) { 374 addWhereQueryCondition(queryColumn.in(queryWrapper)); 375 return queryModel; 376 } 377 378 @Override 379 public R in(QueryWrapper queryWrapper, boolean isEffective) { 380 addWhereQueryCondition(queryColumn.in(queryWrapper, isEffective)); 381 return queryModel; 382 } 383 384 @Override 385 public R in(QueryWrapper queryWrapper, BooleanSupplier isEffective) { 386 addWhereQueryCondition(queryColumn.in(queryWrapper, isEffective)); 387 return queryModel; 388 } 389 390 /** 391 * {@code IN(value)} 392 */ 393 public R in(QueryModel<R> queryModel) { 394 return in(queryModel, true); 395 } 396 397 /** 398 * {@code IN(value)} 399 */ 400 public R in(QueryModel<R> queryModel, boolean isEffective) { 401 if (queryModel != null) { 402 addWhereQueryCondition(queryColumn.in(queryModel.queryWrapper(), isEffective)); 403 } 404 return this.queryModel; 405 } 406 407 /** 408 * {@code IN(value)} 409 */ 410 public R in(QueryModel<R> queryModel, BooleanSupplier isEffective) { 411 return in(queryModel, isEffective.getAsBoolean()); 412 } 413 414 @Override 415 public R notIn(Object... value) { 416 addWhereQueryCondition(queryColumn.notIn(value)); 417 return queryModel; 418 } 419 420 @Override 421 public R notIn(Object[] value, boolean isEffective) { 422 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 423 return queryModel; 424 } 425 426 @Override 427 public R notIn(Object[] value, BooleanSupplier isEffective) { 428 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 429 return queryModel; 430 } 431 432 @Override 433 public <T> R notIn(T[] value, Predicate<T[]> isEffective) { 434 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 435 return queryModel; 436 } 437 438 @Override 439 public R notIn(Collection<?> value) { 440 addWhereQueryCondition(queryColumn.notIn(value)); 441 return queryModel; 442 } 443 444 @Override 445 public R notIn(Collection<?> value, boolean isEffective) { 446 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 447 return queryModel; 448 } 449 450 @Override 451 public R notIn(Collection<?> value, BooleanSupplier isEffective) { 452 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 453 return queryModel; 454 } 455 456 @Override 457 public <T extends Collection<?>> R notIn(T value, Predicate<T> isEffective) { 458 addWhereQueryCondition(queryColumn.notIn(value, isEffective)); 459 return queryModel; 460 } 461 462 @Override 463 public R notIn(QueryWrapper queryWrapper) { 464 addWhereQueryCondition(queryColumn.notIn(queryWrapper)); 465 return queryModel; 466 } 467 468 @Override 469 public R notIn(QueryWrapper queryWrapper, boolean isEffective) { 470 addWhereQueryCondition(queryColumn.notIn(queryWrapper, isEffective)); 471 return queryModel; 472 } 473 474 @Override 475 public R notIn(QueryWrapper queryWrapper, BooleanSupplier isEffective) { 476 addWhereQueryCondition(queryColumn.notIn(queryWrapper, isEffective)); 477 return queryModel; 478 } 479 480 @Override 481 public R between(Object[] values) { 482 addWhereQueryCondition(queryColumn.between(values)); 483 return queryModel; 484 } 485 486 @Override 487 public R between(Object[] values, boolean isEffective) { 488 addWhereQueryCondition(queryColumn.between(values, isEffective)); 489 return queryModel; 490 } 491 492 /** 493 * {@code NOT IN(value)} 494 */ 495 public R notIn(QueryModel<R> queryModel) { 496 return notIn(queryModel, true); 497 } 498 499 /** 500 * {@code NOT IN(value)} 501 */ 502 public R notIn(QueryModel<R> queryModel, boolean isEffective) { 503 if (queryModel != null) { 504 addWhereQueryCondition(queryColumn.notIn(queryModel.queryWrapper(), isEffective)); 505 } 506 return this.queryModel; 507 } 508 509 /** 510 * {@code NOT IN(value)} 511 */ 512 public R notIn(QueryModel<R> queryModel, BooleanSupplier isEffective) { 513 return notIn(queryModel, isEffective.getAsBoolean()); 514 } 515 516 @Override 517 public R between(Object start, Object end) { 518 addWhereQueryCondition(queryColumn.between(start, end)); 519 return queryModel; 520 } 521 522 @Override 523 public R between(Object start, Object end, boolean isEffective) { 524 addWhereQueryCondition(queryColumn.between(start, end, isEffective)); 525 return queryModel; 526 } 527 528 @Override 529 public R between(Object start, Object end, BooleanSupplier isEffective) { 530 addWhereQueryCondition(queryColumn.between(start, end, isEffective)); 531 return queryModel; 532 } 533 534 @Override 535 public <S, E> R between(S start, E end, BiPredicate<S, E> isEffective) { 536 addWhereQueryCondition(queryColumn.between(start, end, isEffective)); 537 return queryModel; 538 } 539 540 @Override 541 public R notBetween(Object[] values) { 542 addWhereQueryCondition(queryColumn.notBetween(values)); 543 return queryModel; 544 } 545 546 @Override 547 public R notBetween(Object[] values, boolean isEffective) { 548 addWhereQueryCondition(queryColumn.notBetween(values, isEffective)); 549 return queryModel; 550 } 551 552 @Override 553 public R notBetween(Object start, Object end) { 554 addWhereQueryCondition(queryColumn.notBetween(start, end)); 555 return queryModel; 556 } 557 558 @Override 559 public R notBetween(Object start, Object end, boolean isEffective) { 560 addWhereQueryCondition(queryColumn.notBetween(start, end, isEffective)); 561 return queryModel; 562 } 563 564 @Override 565 public R notBetween(Object start, Object end, BooleanSupplier isEffective) { 566 addWhereQueryCondition(queryColumn.notBetween(start, end, isEffective)); 567 return queryModel; 568 } 569 570 @Override 571 public <S, E> R notBetween(S start, E end, BiPredicate<S, E> isEffective) { 572 addWhereQueryCondition(queryColumn.notBetween(start, end, isEffective)); 573 return queryModel; 574 } 575 576 @Override 577 public R like(Object value) { 578 addWhereQueryCondition(queryColumn.like(value)); 579 return queryModel; 580 } 581 582 @Override 583 public R like(Object value, boolean isEffective) { 584 addWhereQueryCondition(queryColumn.like(value, isEffective)); 585 return queryModel; 586 } 587 588 @Override 589 public R like(Object value, BooleanSupplier isEffective) { 590 addWhereQueryCondition(queryColumn.like(value, isEffective)); 591 return queryModel; 592 } 593 594 @Override 595 public <T> R like(T value, Predicate<T> isEffective) { 596 addWhereQueryCondition(queryColumn.like(value, isEffective)); 597 return queryModel; 598 } 599 600 @Override 601 public R likeLeft(Object value) { 602 addWhereQueryCondition(queryColumn.likeLeft(value)); 603 return queryModel; 604 } 605 606 @Override 607 public R likeLeft(Object value, boolean isEffective) { 608 addWhereQueryCondition(queryColumn.likeLeft(value, isEffective)); 609 return queryModel; 610 } 611 612 @Override 613 public R likeLeft(Object value, BooleanSupplier isEffective) { 614 addWhereQueryCondition(queryColumn.likeLeft(value, isEffective)); 615 return queryModel; 616 } 617 618 @Override 619 public <T> R likeLeft(T value, Predicate<T> isEffective) { 620 addWhereQueryCondition(queryColumn.likeLeft(value, isEffective)); 621 return queryModel; 622 } 623 624 @Override 625 public R likeRight(Object value) { 626 addWhereQueryCondition(queryColumn.likeRight(value)); 627 return queryModel; 628 } 629 630 @Override 631 public R likeRight(Object value, boolean isEffective) { 632 addWhereQueryCondition(queryColumn.likeRight(value, isEffective)); 633 return queryModel; 634 } 635 636 @Override 637 public R likeRight(Object value, BooleanSupplier isEffective) { 638 addWhereQueryCondition(queryColumn.likeRight(value, isEffective)); 639 return queryModel; 640 } 641 642 @Override 643 public <T> R likeRight(T value, Predicate<T> isEffective) { 644 addWhereQueryCondition(queryColumn.likeRight(value, isEffective)); 645 return queryModel; 646 } 647 648 @Override 649 public R notLike(Object value) { 650 addWhereQueryCondition(queryColumn.notLike(value)); 651 return queryModel; 652 } 653 654 @Override 655 public R notLike(Object value, boolean isEffective) { 656 addWhereQueryCondition(queryColumn.notLike(value, isEffective)); 657 return queryModel; 658 } 659 660 @Override 661 public R notLike(Object value, BooleanSupplier isEffective) { 662 addWhereQueryCondition(queryColumn.notLike(value, isEffective)); 663 return queryModel; 664 } 665 666 @Override 667 public <T> R notLike(T value, Predicate<T> isEffective) { 668 addWhereQueryCondition(queryColumn.notLike(value, isEffective)); 669 return queryModel; 670 } 671 672 @Override 673 public R notLikeLeft(Object value) { 674 addWhereQueryCondition(queryColumn.notLikeLeft(value)); 675 return queryModel; 676 } 677 678 @Override 679 public R notLikeLeft(Object value, boolean isEffective) { 680 addWhereQueryCondition(queryColumn.notLikeLeft(value, isEffective)); 681 return queryModel; 682 } 683 684 @Override 685 public R notLikeLeft(Object value, BooleanSupplier isEffective) { 686 addWhereQueryCondition(queryColumn.notLikeLeft(value, isEffective)); 687 return queryModel; 688 } 689 690 @Override 691 public <T> R notLikeLeft(T value, Predicate<T> isEffective) { 692 addWhereQueryCondition(queryColumn.notLikeLeft(value, isEffective)); 693 return queryModel; 694 } 695 696 @Override 697 public R notLikeRight(Object value) { 698 addWhereQueryCondition(queryColumn.notLikeRight(value)); 699 return queryModel; 700 } 701 702 @Override 703 public R notLikeRight(Object value, boolean isEffective) { 704 addWhereQueryCondition(queryColumn.notLikeRight(value, isEffective)); 705 return queryModel; 706 } 707 708 @Override 709 public R notLikeRight(Object value, BooleanSupplier isEffective) { 710 addWhereQueryCondition(queryColumn.notLikeRight(value, isEffective)); 711 return queryModel; 712 } 713 714 @Override 715 public <T> R notLikeRight(T value, Predicate<T> isEffective) { 716 addWhereQueryCondition(queryColumn.notLikeRight(value, isEffective)); 717 return queryModel; 718 } 719 720 @Override 721 public R isNull(boolean isEffective) { 722 addWhereQueryCondition(queryColumn.isNull(isEffective)); 723 return queryModel; 724 } 725 726 @Override 727 public R isNotNull(boolean isEffective) { 728 addWhereQueryCondition(queryColumn.isNotNull(isEffective)); 729 return queryModel; 730 } 731 732}