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.table.TableInfo; 019import com.mybatisflex.core.table.TableInfoFactory; 020import com.mybatisflex.core.util.ArrayUtil; 021import com.mybatisflex.core.util.LambdaGetter; 022import com.mybatisflex.core.util.LambdaUtil; 023 024import java.util.ArrayList; 025import java.util.Arrays; 026import java.util.List; 027 028import static com.mybatisflex.core.constant.FuncName.*; 029 030/** 031 * SQL 函数。 032 */ 033@SuppressWarnings("unused") 034public class QueryMethods { 035 036 private QueryMethods() { 037 } 038 039 // === 数学函数 === 040 041 /** 042 * 返回 x 的绝对值。 043 */ 044 public static QueryColumn abs(String columnX) { 045 return new FunctionQueryColumn(ABS, columnX); 046 } 047 048 /** 049 * 返回 x 的绝对值。 050 */ 051 public static QueryColumn abs(QueryColumn columnX) { 052 return new FunctionQueryColumn(ABS, columnX); 053 } 054 055 /** 056 * 返回 x 的绝对值。 057 */ 058 public static <T> QueryColumn abs(LambdaGetter<T> columnX) { 059 return new FunctionQueryColumn(ABS, LambdaUtil.getQueryColumn(columnX)); 060 } 061 062 /** 063 * 返回大于或等于 x 的最小整数(向上取整)。 064 */ 065 public static QueryColumn ceil(String columnX) { 066 return new FunctionQueryColumn(CEIL, columnX); 067 } 068 069 /** 070 * 返回大于或等于 x 的最小整数(向上取整)。 071 */ 072 public static QueryColumn ceil(QueryColumn columnX) { 073 return new FunctionQueryColumn(CEIL, columnX); 074 } 075 076 /** 077 * 返回大于或等于 x 的最小整数(向上取整)。 078 */ 079 public static <T> QueryColumn ceil(LambdaGetter<T> columnX) { 080 return new FunctionQueryColumn(CEIL, LambdaUtil.getQueryColumn(columnX)); 081 } 082 083 /** 084 * 返回大于或等于 x 的最小整数(向上取整)。 085 */ 086 public static QueryColumn ceiling(String columnX) { 087 return new FunctionQueryColumn(CEILING, columnX); 088 } 089 090 /** 091 * 返回大于或等于 x 的最小整数(向上取整)。 092 */ 093 public static QueryColumn ceiling(QueryColumn columnX) { 094 return new FunctionQueryColumn(CEILING, columnX); 095 } 096 097 /** 098 * 返回大于或等于 x 的最小整数(向上取整)。 099 */ 100 public static <T> QueryColumn ceiling(LambdaGetter<T> columnX) { 101 return new FunctionQueryColumn(CEILING, LambdaUtil.getQueryColumn(columnX)); 102 } 103 104 /** 105 * 返回小于或等于 x 的最大整数(向下取整)。 106 */ 107 public static QueryColumn floor(String columnX) { 108 return new FunctionQueryColumn(FLOOR, columnX); 109 } 110 111 /** 112 * 返回小于或等于 x 的最大整数(向下取整)。 113 */ 114 public static QueryColumn floor(QueryColumn columnX) { 115 return new FunctionQueryColumn(FLOOR, columnX); 116 } 117 118 /** 119 * 返回小于或等于 x 的最大整数(向下取整)。 120 */ 121 public static <T> QueryColumn floor(LambdaGetter<T> columnX) { 122 return new FunctionQueryColumn(FLOOR, LambdaUtil.getQueryColumn(columnX)); 123 } 124 125 /** 126 * 返回 0~1 的随机数。 127 */ 128 public static QueryColumn rand() { 129 return new FunctionQueryColumn(RAND); 130 } 131 132 /** 133 * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 134 */ 135 public static QueryColumn rand(String columnX) { 136 return new FunctionQueryColumn(RAND, columnX); 137 } 138 139 /** 140 * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 141 */ 142 public static QueryColumn rand(QueryColumn columnX) { 143 return new FunctionQueryColumn(RAND, columnX); 144 } 145 146 /** 147 * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 148 */ 149 public static <T> QueryColumn rand(LambdaGetter<T> columnX) { 150 return new FunctionQueryColumn(RAND, LambdaUtil.getQueryColumn(columnX)); 151 } 152 153 /** 154 * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 155 */ 156 public static QueryColumn sign(String columnX) { 157 return new FunctionQueryColumn(SIGN, columnX); 158 } 159 160 /** 161 * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 162 */ 163 public static QueryColumn sign(QueryColumn columnX) { 164 return new FunctionQueryColumn(SIGN, columnX); 165 } 166 167 /** 168 * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 169 */ 170 public static <T> QueryColumn sign(LambdaGetter<T> columnX) { 171 return new FunctionQueryColumn(SIGN, LambdaUtil.getQueryColumn(columnX)); 172 } 173 174 /** 175 * 返回圆周率。 176 */ 177 public static QueryColumn pi() { 178 return new FunctionQueryColumn(PI); 179 } 180 181 /** 182 * 返回数值 x 保留到小数点后 y 位的值。 183 */ 184 public static QueryColumn truncate(String columnX, String columnY) { 185 return new FunctionQueryColumn(TRUNCATE, columnX, columnY); 186 } 187 188 /** 189 * 返回数值 x 保留到小数点后 y 位的值。 190 */ 191 public static QueryColumn truncate(QueryColumn columnX, QueryColumn columnY) { 192 return new FunctionQueryColumn(TRUNCATE, columnX, columnY); 193 } 194 195 /** 196 * 返回数值 x 保留到小数点后 y 位的值。 197 */ 198 public static <X, Y> QueryColumn truncate(LambdaGetter<X> columnX, LambdaGetter<Y> columnY) { 199 return new FunctionQueryColumn(TRUNCATE, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); 200 } 201 202 /** 203 * 返回数值 x 保留到小数点后 y 位的值。 204 */ 205 public static QueryColumn truncate(String columnX, Integer y) { 206 return new FunctionQueryColumn(TRUNCATE, new QueryColumn(columnX), number(y)); 207 } 208 209 /** 210 * 返回数值 x 保留到小数点后 y 位的值。 211 */ 212 public static QueryColumn truncate(QueryColumn columnX, Integer y) { 213 return new FunctionQueryColumn(TRUNCATE, columnX, number(y)); 214 } 215 216 /** 217 * 返回数值 x 保留到小数点后 y 位的值。 218 */ 219 public static <T> QueryColumn truncate(LambdaGetter<T> columnX, Integer y) { 220 return new FunctionQueryColumn(TRUNCATE, LambdaUtil.getQueryColumn(columnX), number(y)); 221 } 222 223 /** 224 * 返回离 x 最近的整数(四舍五入)。 225 */ 226 public static QueryColumn round(String columnX) { 227 return new FunctionQueryColumn(ROUND, columnX); 228 } 229 230 /** 231 * 返回离 x 最近的整数(四舍五入)。 232 */ 233 public static QueryColumn round(QueryColumn columnX) { 234 return new FunctionQueryColumn(ROUND, columnX); 235 } 236 237 /** 238 * 返回离 x 最近的整数(四舍五入)。 239 */ 240 public static <T> QueryColumn round(LambdaGetter<T> columnX) { 241 return new FunctionQueryColumn(ROUND, LambdaUtil.getQueryColumn(columnX)); 242 } 243 244 /** 245 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 246 */ 247 public static QueryColumn round(String columnX, String columnY) { 248 return new FunctionQueryColumn(ROUND, columnX, columnY); 249 } 250 251 /** 252 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 253 */ 254 public static QueryColumn round(QueryColumn columnX, QueryColumn columnY) { 255 return new FunctionQueryColumn(ROUND, columnX, columnY); 256 } 257 258 /** 259 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 260 */ 261 public static <X, Y> QueryColumn round(LambdaGetter<X> columnX, LambdaGetter<Y> columnY) { 262 return new FunctionQueryColumn(ROUND, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); 263 } 264 265 /** 266 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 267 */ 268 public static QueryColumn round(String columnX, Integer y) { 269 return new FunctionQueryColumn(ROUND, new QueryColumn(columnX), number(y)); 270 } 271 272 /** 273 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 274 */ 275 public static QueryColumn round(QueryColumn columnX, Integer y) { 276 return new FunctionQueryColumn(ROUND, columnX, number(y)); 277 } 278 279 /** 280 * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 281 */ 282 public static <T> QueryColumn round(LambdaGetter<T> columnX, Integer y) { 283 return new FunctionQueryColumn(ROUND, LambdaUtil.getQueryColumn(columnX), number(y)); 284 } 285 286 /** 287 * 返回 x 的 y 次方。 288 */ 289 public static QueryColumn pow(String columnX, String columnY) { 290 return new FunctionQueryColumn(POW, columnX, columnY); 291 } 292 293 /** 294 * 返回 x 的 y 次方。 295 */ 296 public static QueryColumn pow(QueryColumn columnX, QueryColumn columnY) { 297 return new FunctionQueryColumn(POW, columnX, columnY); 298 } 299 300 /** 301 * 返回 x 的 y 次方。 302 */ 303 public static <X, Y> QueryColumn pow(LambdaGetter<X> columnX, LambdaGetter<Y> columnY) { 304 return new FunctionQueryColumn(POW, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); 305 } 306 307 /** 308 * 返回 x 的 y 次方。 309 */ 310 public static QueryColumn pow(String columnX, Integer y) { 311 return new FunctionQueryColumn(POW, new QueryColumn(columnX), number(y)); 312 } 313 314 /** 315 * 返回 x 的 y 次方。 316 */ 317 public static QueryColumn pow(QueryColumn columnX, Integer y) { 318 return new FunctionQueryColumn(POW, columnX, number(y)); 319 } 320 321 /** 322 * 返回 x 的 y 次方。 323 */ 324 public static <T> QueryColumn pow(LambdaGetter<T> columnX, Integer y) { 325 return new FunctionQueryColumn(POW, LambdaUtil.getQueryColumn(columnX), number(y)); 326 } 327 328 /** 329 * 返回 x 的 y 次方。 330 */ 331 public static QueryColumn power(String columnX, String columnY) { 332 return new FunctionQueryColumn(POWER, columnX, columnY); 333 } 334 335 /** 336 * 返回 x 的 y 次方。 337 */ 338 public static QueryColumn power(QueryColumn columnX, QueryColumn columnY) { 339 return new FunctionQueryColumn(POWER, columnX, columnY); 340 } 341 342 /** 343 * 返回 x 的 y 次方。 344 */ 345 public static <X, Y> QueryColumn power(LambdaGetter<X> columnX, LambdaGetter<Y> columnY) { 346 return new FunctionQueryColumn(POWER, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); 347 } 348 349 /** 350 * 返回 x 的 y 次方。 351 */ 352 public static QueryColumn power(String columnX, Integer y) { 353 return new FunctionQueryColumn(POWER, new QueryColumn(columnX), number(y)); 354 } 355 356 /** 357 * 返回 x 的 y 次方。 358 */ 359 public static QueryColumn power(QueryColumn columnX, Integer y) { 360 return new FunctionQueryColumn(POWER, columnX, number(y)); 361 } 362 363 /** 364 * 返回 x 的 y 次方。 365 */ 366 public static <T> QueryColumn power(LambdaGetter<T> columnX, Integer y) { 367 return new FunctionQueryColumn(POWER, LambdaUtil.getQueryColumn(columnX), number(y)); 368 } 369 370 /** 371 * 返回 x 的平方根。 372 */ 373 public static QueryColumn sqrt(String columnX) { 374 return new FunctionQueryColumn(SQRT, columnX); 375 } 376 377 /** 378 * 返回 x 的平方根。 379 */ 380 public static QueryColumn sqrt(QueryColumn columnX) { 381 return new FunctionQueryColumn(SQRT, columnX); 382 } 383 384 /** 385 * 返回 x 的平方根。 386 */ 387 public static <T> QueryColumn sqrt(LambdaGetter<T> columnX) { 388 return new FunctionQueryColumn(SQRT, LambdaUtil.getQueryColumn(columnX)); 389 } 390 391 /** 392 * 返回 e 的 x 次方。 393 */ 394 public static QueryColumn exp(String columnX) { 395 return new FunctionQueryColumn(EXP, columnX); 396 } 397 398 /** 399 * 返回 e 的 x 次方。 400 */ 401 public static QueryColumn exp(QueryColumn columnX) { 402 return new FunctionQueryColumn(EXP, columnX); 403 } 404 405 /** 406 * 返回 e 的 x 次方。 407 */ 408 public static <T> QueryColumn exp(LambdaGetter<T> columnX) { 409 return new FunctionQueryColumn(EXP, LambdaUtil.getQueryColumn(columnX)); 410 } 411 412 /** 413 * 返回 x 除以 y 以后的余数。 414 */ 415 public static QueryColumn mod(String columnX, String columnY) { 416 return new FunctionQueryColumn(MOD, columnX, columnY); 417 } 418 419 /** 420 * 返回 x 除以 y 以后的余数。 421 */ 422 public static QueryColumn mod(QueryColumn columnX, QueryColumn columnY) { 423 return new FunctionQueryColumn(MOD, columnX, columnY); 424 } 425 426 /** 427 * 返回 x 除以 y 以后的余数。 428 */ 429 public static <X, Y> QueryColumn mod(LambdaGetter<X> columnX, LambdaGetter<Y> columnY) { 430 return new FunctionQueryColumn(MOD, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); 431 } 432 433 /** 434 * 返回 x 除以 y 以后的余数。 435 */ 436 public static QueryColumn mod(String columnX, Integer y) { 437 return new FunctionQueryColumn(MOD, new QueryColumn(columnX), number(y)); 438 } 439 440 /** 441 * 返回 x 除以 y 以后的余数。 442 */ 443 public static QueryColumn mod(QueryColumn columnX, Integer y) { 444 return new FunctionQueryColumn(MOD, columnX, number(y)); 445 } 446 447 /** 448 * 返回 x 除以 y 以后的余数。 449 */ 450 public static <T> QueryColumn mod(LambdaGetter<T> columnX, Integer y) { 451 return new FunctionQueryColumn(MOD, LambdaUtil.getQueryColumn(columnX), number(y)); 452 } 453 454 /** 455 * 返回自然对数(以 e 为底的对数)。 456 */ 457 public static QueryColumn log(String columnX) { 458 return new FunctionQueryColumn(LOG, columnX); 459 } 460 461 /** 462 * 返回自然对数(以 e 为底的对数)。 463 */ 464 public static QueryColumn log(QueryColumn columnX) { 465 return new FunctionQueryColumn(LOG, columnX); 466 } 467 468 /** 469 * 返回自然对数(以 e 为底的对数)。 470 */ 471 public static <T> QueryColumn log(LambdaGetter<T> columnX) { 472 return new FunctionQueryColumn(LOG, LambdaUtil.getQueryColumn(columnX)); 473 } 474 475 /** 476 * 返回以 10 为底的对数。 477 */ 478 public static QueryColumn log10(String columnX) { 479 return new FunctionQueryColumn(LOG10, columnX); 480 } 481 482 /** 483 * 返回以 10 为底的对数。 484 */ 485 public static QueryColumn log10(QueryColumn columnX) { 486 return new FunctionQueryColumn(LOG10, columnX); 487 } 488 489 /** 490 * 返回以 10 为底的对数。 491 */ 492 public static <T> QueryColumn log10(LambdaGetter<T> columnX) { 493 return new FunctionQueryColumn(LOG10, LambdaUtil.getQueryColumn(columnX)); 494 } 495 496 /** 497 * 将角度转换为弧度。 498 */ 499 public static QueryColumn radians(String columnX) { 500 return new FunctionQueryColumn(RADIANS, columnX); 501 } 502 503 /** 504 * 将角度转换为弧度。 505 */ 506 public static QueryColumn radians(QueryColumn columnX) { 507 return new FunctionQueryColumn(RADIANS, columnX); 508 } 509 510 /** 511 * 将角度转换为弧度。 512 */ 513 public static <T> QueryColumn radians(LambdaGetter<T> columnX) { 514 return new FunctionQueryColumn(RADIANS, LambdaUtil.getQueryColumn(columnX)); 515 } 516 517 /** 518 * 将弧度转换为角度。 519 */ 520 public static QueryColumn degrees(String columnX) { 521 return new FunctionQueryColumn(DEGREES, columnX); 522 } 523 524 /** 525 * 将弧度转换为角度。 526 */ 527 public static QueryColumn degrees(QueryColumn columnX) { 528 return new FunctionQueryColumn(DEGREES, columnX); 529 } 530 531 /** 532 * 将弧度转换为角度。 533 */ 534 public static <T> QueryColumn degrees(LambdaGetter<T> columnX) { 535 return new FunctionQueryColumn(DEGREES, LambdaUtil.getQueryColumn(columnX)); 536 } 537 538 /** 539 * 求正弦值。 540 */ 541 public static QueryColumn sin(String columnX) { 542 return new FunctionQueryColumn(SIN, columnX); 543 } 544 545 /** 546 * 求正弦值。 547 */ 548 public static QueryColumn sin(QueryColumn columnX) { 549 return new FunctionQueryColumn(SIN, columnX); 550 } 551 552 /** 553 * 求正弦值。 554 */ 555 public static <T> QueryColumn sin(LambdaGetter<T> columnX) { 556 return new FunctionQueryColumn(SIN, LambdaUtil.getQueryColumn(columnX)); 557 } 558 559 /** 560 * 求反正弦值。 561 */ 562 public static QueryColumn asin(String columnX) { 563 return new FunctionQueryColumn(ASIN, columnX); 564 } 565 566 /** 567 * 求反正弦值。 568 */ 569 public static QueryColumn asin(QueryColumn columnX) { 570 return new FunctionQueryColumn(ASIN, columnX); 571 } 572 573 /** 574 * 求反正弦值。 575 */ 576 public static <T> QueryColumn asin(LambdaGetter<T> columnX) { 577 return new FunctionQueryColumn(ASIN, LambdaUtil.getQueryColumn(columnX)); 578 } 579 580 /** 581 * 求余弦值。 582 */ 583 public static QueryColumn cos(String columnX) { 584 return new FunctionQueryColumn(COS, columnX); 585 } 586 587 /** 588 * 求余弦值。 589 */ 590 public static QueryColumn cos(QueryColumn columnX) { 591 return new FunctionQueryColumn(COS, columnX); 592 } 593 594 /** 595 * 求余弦值。 596 */ 597 public static <T> QueryColumn cos(LambdaGetter<T> columnX) { 598 return new FunctionQueryColumn(COS, LambdaUtil.getQueryColumn(columnX)); 599 } 600 601 /** 602 * 求反余弦值。 603 */ 604 public static QueryColumn acos(String columnX) { 605 return new FunctionQueryColumn(ACOS, columnX); 606 } 607 608 /** 609 * 求反余弦值。 610 */ 611 public static QueryColumn acos(QueryColumn columnX) { 612 return new FunctionQueryColumn(ACOS, columnX); 613 } 614 615 /** 616 * 求反余弦值。 617 */ 618 public static <T> QueryColumn acos(LambdaGetter<T> columnX) { 619 return new FunctionQueryColumn(ACOS, LambdaUtil.getQueryColumn(columnX)); 620 } 621 622 /** 623 * 求正切值。 624 */ 625 public static QueryColumn tan(String columnX) { 626 return new FunctionQueryColumn(TAN, columnX); 627 } 628 629 /** 630 * 求正切值。 631 */ 632 public static QueryColumn tan(QueryColumn columnX) { 633 return new FunctionQueryColumn(TAN, columnX); 634 } 635 636 /** 637 * 求正切值。 638 */ 639 public static <T> QueryColumn tan(LambdaGetter<T> columnX) { 640 return new FunctionQueryColumn(TAN, LambdaUtil.getQueryColumn(columnX)); 641 } 642 643 /** 644 * 求反正切值。 645 */ 646 public static QueryColumn atan(String columnX) { 647 return new FunctionQueryColumn(ATAN, columnX); 648 } 649 650 /** 651 * 求反正切值。 652 */ 653 public static QueryColumn atan(QueryColumn columnX) { 654 return new FunctionQueryColumn(ATAN, columnX); 655 } 656 657 /** 658 * 求反正切值。 659 */ 660 public static <T> QueryColumn atan(LambdaGetter<T> columnX) { 661 return new FunctionQueryColumn(ATAN, LambdaUtil.getQueryColumn(columnX)); 662 } 663 664 /** 665 * 求余切值。 666 */ 667 public static QueryColumn cot(String columnX) { 668 return new FunctionQueryColumn(COT, columnX); 669 } 670 671 /** 672 * 求余切值。 673 */ 674 public static QueryColumn cot(QueryColumn columnX) { 675 return new FunctionQueryColumn(COT, columnX); 676 } 677 678 /** 679 * 求余切值。 680 */ 681 public static <T> QueryColumn cot(LambdaGetter<T> columnX) { 682 return new FunctionQueryColumn(COT, LambdaUtil.getQueryColumn(columnX)); 683 } 684 685 // === 字符串函数 === 686 687 /** 688 * 返回字符串 s 的字符数。 689 */ 690 public static QueryColumn charLength(String columnS) { 691 return new FunctionQueryColumn(CHAR_LENGTH, columnS); 692 } 693 694 /** 695 * 返回字符串 s 的字符数。 696 */ 697 public static QueryColumn charLength(QueryColumn columnS) { 698 return new FunctionQueryColumn(CHAR_LENGTH, columnS); 699 } 700 701 /** 702 * 返回字符串 s 的字符数。 703 */ 704 public static <T> QueryColumn charLength(LambdaGetter<T> columnS) { 705 return new FunctionQueryColumn(CHAR_LENGTH, LambdaUtil.getQueryColumn(columnS)); 706 } 707 708 /** 709 * 返回字符串 s 的长度。 710 */ 711 public static QueryColumn length(String columnS) { 712 return new FunctionQueryColumn(LENGTH, columnS); 713 } 714 715 /** 716 * 返回字符串 s 的长度。 717 */ 718 public static QueryColumn length(QueryColumn columnS) { 719 return new FunctionQueryColumn(LENGTH, columnS); 720 } 721 722 /** 723 * 返回字符串 s 的长度。 724 */ 725 public static <T> QueryColumn length(LambdaGetter<T> columnS) { 726 return new FunctionQueryColumn(LENGTH, LambdaUtil.getQueryColumn(columnS)); 727 } 728 729 /** 730 * 将字符串 s1,s2 等多个字符串合并为一个字符串。 731 */ 732 public static QueryColumn concat(String columnS1, String columnS2, String... columnN) { 733 return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new String[]{columnS1, columnS2}, columnN)); 734 } 735 736 /** 737 * 将字符串 s1,s2 等多个字符串合并为一个字符串。 738 */ 739 public static QueryColumn concat(QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) { 740 return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new QueryColumn[]{columnS1, columnS2}, columnN)); 741 } 742 743 /** 744 * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。 745 */ 746 public static QueryColumn concatWs(String columnX, String columnS1, String columnS2, String... columnN) { 747 return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new String[]{columnX, columnS1, columnS2}, columnN)); 748 } 749 750 /** 751 * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。 752 */ 753 public static QueryColumn concatWs(QueryColumn columnX, QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) { 754 return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new QueryColumn[]{columnX, columnS1, columnS2}, columnN)); 755 } 756 757 /** 758 * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。 759 */ 760 public static QueryColumn insert(String columnS1, String columnX, String columnLen, String columnS2) { 761 return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2); 762 } 763 764 /** 765 * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。 766 */ 767 public static QueryColumn insert(QueryColumn columnS1, QueryColumn columnX, QueryColumn columnLen, QueryColumn columnS2) { 768 return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2); 769 } 770 771 /** 772 * 将字符串 s 的所有字符都变成大写字母。 773 */ 774 public static QueryColumn upper(String columnS) { 775 return new FunctionQueryColumn(UPPER, columnS); 776 } 777 778 /** 779 * 将字符串 s 的所有字符都变成大写字母。 780 */ 781 public static QueryColumn upper(QueryColumn columnS) { 782 return new FunctionQueryColumn(UPPER, columnS); 783 } 784 785 /** 786 * 将字符串 s 的所有字符都变成大写字母。 787 */ 788 public static <T> QueryColumn upper(LambdaGetter<T> columnS) { 789 return new FunctionQueryColumn(UPPER, LambdaUtil.getQueryColumn(columnS)); 790 } 791 792 /** 793 * 将字符串 s 的所有字符都变成小写字母。 794 */ 795 public static QueryColumn lower(String columnS) { 796 return new FunctionQueryColumn(LOWER, columnS); 797 } 798 799 /** 800 * 将字符串 s 的所有字符都变成小写字母。 801 */ 802 public static QueryColumn lower(QueryColumn columnS) { 803 return new FunctionQueryColumn(LOWER, columnS); 804 } 805 806 /** 807 * 将字符串 s 的所有字符都变成小写字母。 808 */ 809 public static <T> QueryColumn lower(LambdaGetter<T> columnS) { 810 return new FunctionQueryColumn(LOWER, LambdaUtil.getQueryColumn(columnS)); 811 } 812 813 /** 814 * 返回字符串 s 的前 n 个字符。 815 */ 816 public static QueryColumn left(String columnS, int length) { 817 return new FunctionQueryColumn(LEFT, string(columnS), number(length)); 818 } 819 820 /** 821 * 返回字符串 s 的前 n 个字符。 822 */ 823 public static QueryColumn left(QueryColumn columnS, int length) { 824 return new FunctionQueryColumn(LEFT, columnS, number(length)); 825 } 826 827 /** 828 * 返回字符串 s 的前 n 个字符。 829 */ 830 public static <S, N> QueryColumn left(LambdaGetter<S> columnS, int length) { 831 return new FunctionQueryColumn(LEFT, LambdaUtil.getQueryColumn(columnS), number(length)); 832 } 833 834 835 /** 836 * 返回字符串 s 的后 length 个字符。 837 */ 838 public static QueryColumn right(String columnS, int length) { 839 return new FunctionQueryColumn(RIGHT, string(columnS), number(length)); 840 } 841 842 /** 843 * 返回字符串 s 的后 length 个字符。 844 */ 845 public static QueryColumn right(QueryColumn columnS, int length) { 846 return new FunctionQueryColumn(RIGHT, columnS, number(length)); 847 } 848 849 /** 850 * 返回字符串 s 的后 length 个字符。 851 */ 852 public static <S, N> QueryColumn right(LambdaGetter<S> columnS, int length) { 853 return new FunctionQueryColumn(RIGHT, LambdaUtil.getQueryColumn(columnS), number(length)); 854 } 855 856 /** 857 * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 858 */ 859 public static QueryColumn lpad(String columnS1, String columnLen, String columnS2) { 860 return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2); 861 } 862 863 /** 864 * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 865 */ 866 public static QueryColumn lpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) { 867 return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2); 868 } 869 870 /** 871 * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 872 */ 873 public static <S1, L, S2> QueryColumn lpad(LambdaGetter<S1> columnS1, LambdaGetter<L> columnLen, LambdaGetter<S2> columnS2) { 874 return new FunctionQueryColumn(LPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2)); 875 } 876 877 /** 878 * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 879 */ 880 public static QueryColumn rpad(String columnS1, String columnLen, String columnS2) { 881 return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2); 882 } 883 884 /** 885 * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 886 */ 887 public static QueryColumn rpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) { 888 return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2); 889 } 890 891 /** 892 * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 893 */ 894 public static <S1, L, S2> QueryColumn rpad(LambdaGetter<S1> columnS1, LambdaGetter<L> columnLen, LambdaGetter<S2> columnS2) { 895 return new FunctionQueryColumn(RPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2)); 896 } 897 898 /** 899 * 去掉字符串 s 开始处的空格。 900 */ 901 public static QueryColumn ltrim(String columnS) { 902 return new FunctionQueryColumn(LTRIM, columnS); 903 } 904 905 /** 906 * 去掉字符串 s 开始处的空格。 907 */ 908 public static QueryColumn ltrim(QueryColumn columnS) { 909 return new FunctionQueryColumn(LTRIM, columnS); 910 } 911 912 /** 913 * 去掉字符串 s 开始处的空格。 914 */ 915 public static <T> QueryColumn ltrim(LambdaGetter<T> columnS) { 916 return new FunctionQueryColumn(LTRIM, LambdaUtil.getQueryColumn(columnS)); 917 } 918 919 /** 920 * 去掉字符串 s 结尾处的空格。 921 */ 922 public static QueryColumn rtrim(String columnS) { 923 return new FunctionQueryColumn(RTRIM, columnS); 924 } 925 926 /** 927 * 去掉字符串 s 结尾处的空格。 928 */ 929 public static QueryColumn rtrim(QueryColumn columnS) { 930 return new FunctionQueryColumn(RTRIM, columnS); 931 } 932 933 /** 934 * 去掉字符串 s 结尾处的空格。 935 */ 936 public static <T> QueryColumn rtrim(LambdaGetter<T> columnS) { 937 return new FunctionQueryColumn(RTRIM, LambdaUtil.getQueryColumn(columnS)); 938 } 939 940 /** 941 * 去掉字符串 s 开始处和结尾处的空格。 942 */ 943 public static QueryColumn trim(QueryColumn columnS) { 944 return new FunctionQueryColumn(TRIM, columnS); 945 } 946 947 /** 948 * 将字符串 s 重复 n 次。 949 */ 950 public static QueryColumn repeat(String columnS, String columnN) { 951 return new FunctionQueryColumn(REPEAT, columnS, columnN); 952 } 953 954 /** 955 * 将字符串 s 重复 n 次。 956 */ 957 public static QueryColumn repeat(QueryColumn columnS, QueryColumn columnN) { 958 return new FunctionQueryColumn(REPEAT, columnS, columnN); 959 } 960 961 /** 962 * 将字符串 s 重复 n 次。 963 */ 964 public static <S, N> QueryColumn repeat(LambdaGetter<S> columnS, LambdaGetter<N> columnN) { 965 return new FunctionQueryColumn(REPEAT, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN)); 966 } 967 968 /** 969 * 将字符串 s 重复 n 次。 970 */ 971 public static QueryColumn repeat(String columnX, Integer n) { 972 return new FunctionQueryColumn(REPEAT, new QueryColumn(columnX), number(n)); 973 } 974 975 /** 976 * 将字符串 s 重复 n 次。 977 */ 978 public static QueryColumn repeat(QueryColumn columnX, Integer n) { 979 return new FunctionQueryColumn(REPEAT, columnX, number(n)); 980 } 981 982 /** 983 * 将字符串 s 重复 n 次。 984 */ 985 public static <T> QueryColumn repeat(LambdaGetter<T> columnX, Integer n) { 986 return new FunctionQueryColumn(REPEAT, LambdaUtil.getQueryColumn(columnX), number(n)); 987 } 988 989 /** 990 * 返回 n 个空格。 991 */ 992 public static QueryColumn space(String columnN) { 993 return new FunctionQueryColumn(SPACE, columnN); 994 } 995 996 /** 997 * 返回 n 个空格。 998 */ 999 public static QueryColumn space(QueryColumn columnN) { 1000 return new FunctionQueryColumn(SPACE, columnN); 1001 } 1002 1003 /** 1004 * 返回 n 个空格。 1005 */ 1006 public static <T> QueryColumn space(LambdaGetter<T> columnN) { 1007 return new FunctionQueryColumn(SPACE, LambdaUtil.getQueryColumn(columnN)); 1008 } 1009 1010 /** 1011 * 用字符串 s2 代替字符串 s 中的字符串 s1。 1012 */ 1013 public static QueryColumn replace(String columnS, String columnS1, String columnS2) { 1014 return new StringFunctionQueryColumn(REPLACE, columnS, columnS1, columnS2); 1015 } 1016 1017 /** 1018 * 用字符串 s2 代替字符串 s 中的字符串 s1。 1019 */ 1020 public static QueryColumn replace(QueryColumn columnS, QueryColumn columnS1, QueryColumn columnS2) { 1021 return new FunctionQueryColumn(REPLACE, columnS, columnS1, columnS2); 1022 } 1023 1024 /** 1025 * 用字符串 s2 代替字符串 s 中的字符串 s1。 1026 */ 1027 public static <S, S1, S2> QueryColumn replace(LambdaGetter<S> columnS, LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) { 1028 return new FunctionQueryColumn(REPLACE, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); 1029 } 1030 1031 /** 1032 * 比较字符串 s1 和 s2。 1033 */ 1034 public static QueryColumn strcmp(String columnS1, String columnS2) { 1035 return new FunctionQueryColumn(STRCMP, columnS1, columnS2); 1036 } 1037 1038 /** 1039 * 比较字符串 s1 和 s2。 1040 */ 1041 public static QueryColumn strcmp(QueryColumn columnS1, QueryColumn columnS2) { 1042 return new FunctionQueryColumn(STRCMP, columnS1, columnS2); 1043 } 1044 1045 /** 1046 * 比较字符串 s1 和 s2。 1047 */ 1048 public static <S1, S2> QueryColumn strcmp(LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) { 1049 return new FunctionQueryColumn(STRCMP, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); 1050 } 1051 1052 1053 /** 1054 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1055 */ 1056 public static QueryColumn substring(String columnS, int position) { 1057 return new FunctionQueryColumn(SUBSTRING, string(columnS), number(position)); 1058 } 1059 1060 /** 1061 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1062 */ 1063 public static QueryColumn substring(QueryColumn columnS, int position) { 1064 return new FunctionQueryColumn(SUBSTRING, columnS, number(position)); 1065 } 1066 1067 /** 1068 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1069 */ 1070 public static <S, N, L> QueryColumn substring(LambdaGetter<S> columnS, int position) { 1071 return new FunctionQueryColumn(SUBSTRING, LambdaUtil.getQueryColumn(columnS), number(position)); 1072 } 1073 1074 /** 1075 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1076 */ 1077 public static QueryColumn substring(String columnS, int position, int length) { 1078 return new FunctionQueryColumn(SUBSTRING, string(columnS), number(position), number(length)); 1079 } 1080 1081 /** 1082 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1083 */ 1084 public static QueryColumn substring(QueryColumn columnS, int position, int length) { 1085 return new FunctionQueryColumn(SUBSTRING, columnS, number(position), number(length)); 1086 } 1087 1088 /** 1089 * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。 1090 */ 1091 public static <S, N, L> QueryColumn substring(LambdaGetter<S> columnS, int position, int length) { 1092 return new FunctionQueryColumn(SUBSTRING, LambdaUtil.getQueryColumn(columnS), number(position), number(length)); 1093 } 1094 1095 /** 1096 * 从字符串 s 中获取 s1 的开始位置。 1097 */ 1098 public static QueryColumn instr(String columnS, String columnS1) { 1099 return new FunctionQueryColumn(INSTR, columnS, columnS1); 1100 } 1101 1102 /** 1103 * 从字符串 s 中获取 s1 的开始位置。 1104 */ 1105 public static QueryColumn instr(QueryColumn columnS, QueryColumn columnS1) { 1106 return new FunctionQueryColumn(INSTR, columnS, columnS1); 1107 } 1108 1109 /** 1110 * 从字符串 s 中获取 s1 的开始位置。 1111 */ 1112 public static <S, S1> QueryColumn instr(LambdaGetter<S> columnS, LambdaGetter<S1> columnS1) { 1113 return new FunctionQueryColumn(INSTR, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1)); 1114 } 1115 1116 /** 1117 * 将字符串 s 的顺序反过来。 1118 */ 1119 public static QueryColumn reverse(String columnS) { 1120 return new FunctionQueryColumn(REVERSE, columnS); 1121 } 1122 1123 /** 1124 * 将字符串 s 的顺序反过来。 1125 */ 1126 public static QueryColumn reverse(QueryColumn columnS) { 1127 return new FunctionQueryColumn(REVERSE, columnS); 1128 } 1129 1130 /** 1131 * 将字符串 s 的顺序反过来。 1132 */ 1133 public static <T> QueryColumn reverse(LambdaGetter<T> columnS) { 1134 return new FunctionQueryColumn(REVERSE, LambdaUtil.getQueryColumn(columnS)); 1135 } 1136 1137 /** 1138 * 返回第 n 个字符串。 1139 */ 1140 public static QueryColumn elt(String columnN, String columnS1, String... columnSn) { 1141 return new FunctionQueryColumn(ELT, ArrayUtil.concat(new String[]{columnN, columnS1}, columnSn)); 1142 } 1143 1144 /** 1145 * 返回第 n 个字符串。 1146 */ 1147 public static QueryColumn elt(QueryColumn columnN, QueryColumn columnS1, QueryColumn... columnSn) { 1148 return new FunctionQueryColumn(ELT, ArrayUtil.concat(new QueryColumn[]{columnN, columnS1}, columnSn)); 1149 } 1150 1151 /** 1152 * 返回第一个与字符串 s 匹配的字符串的位置。 1153 */ 1154 public static QueryColumn field(String columnS, String columnS1, String... columnSn) { 1155 return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new String[]{columnS, columnS1}, columnSn)); 1156 } 1157 1158 /** 1159 * 返回第一个与字符串 s 匹配的字符串的位置。 1160 */ 1161 public static QueryColumn field(QueryColumn columnS, QueryColumn columnS1, QueryColumn... columnSn) { 1162 return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new QueryColumn[]{columnS, columnS1}, columnSn)); 1163 } 1164 1165 /** 1166 * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 1167 */ 1168 public static QueryColumn findInSet(String columnS1, String columnS2) { 1169 return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2); 1170 } 1171 1172 /** 1173 * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 1174 */ 1175 public static QueryColumn findInSet(QueryColumn columnS1, QueryColumn columnS2) { 1176 return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2); 1177 } 1178 1179 /** 1180 * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 1181 */ 1182 public static <S1, S2> QueryColumn findInSet(LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) { 1183 return new FunctionQueryColumn(FIND_IN_SET, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); 1184 } 1185 1186 // === 日期时间函数 === 1187 1188 /** 1189 * 返回当前日期。 1190 */ 1191 public static QueryColumn curDate() { 1192 return new FunctionQueryColumn(CURDATE); 1193 } 1194 1195 /** 1196 * 返回当前日期。 1197 */ 1198 public static QueryColumn currentDate() { 1199 return new FunctionQueryColumn(CURRENT_DATE); 1200 } 1201 1202 /** 1203 * 返回当前时间。 1204 */ 1205 public static QueryColumn curTime() { 1206 return new FunctionQueryColumn(CURTIME); 1207 } 1208 1209 /** 1210 * 返回当前时间。 1211 */ 1212 public static QueryColumn currentTime() { 1213 return new FunctionQueryColumn(CURRENT_TIME); 1214 } 1215 1216 /** 1217 * 返回当前日期和时间。 1218 */ 1219 public static QueryColumn now() { 1220 return new FunctionQueryColumn(NOW); 1221 } 1222 1223 /** 1224 * 返回当前日期和时间。 1225 */ 1226 public static QueryColumn currentTimestamp() { 1227 return new FunctionQueryColumn(CURRENT_TIMESTAMP); 1228 } 1229 1230 /** 1231 * 返回当前日期和时间。 1232 */ 1233 public static QueryColumn localTime() { 1234 return new FunctionQueryColumn(LOCALTIME); 1235 } 1236 1237 /** 1238 * 返回当前日期和时间。 1239 */ 1240 public static QueryColumn sysDate() { 1241 return new FunctionQueryColumn(SYSDATE); 1242 } 1243 1244 1245 /** 1246 * 返回当前日期和时间。 1247 */ 1248 public static QueryColumn localTimestamp() { 1249 return new FunctionQueryColumn(LOCALTIMESTAMP); 1250 } 1251 1252 /** 1253 * 以 UNIX 时间戳的形式返回当前时间。 1254 */ 1255 public static QueryColumn unixTimestamp() { 1256 return new FunctionQueryColumn(UNIX_TIMESTAMP); 1257 } 1258 1259 /** 1260 * 将时间 d 以 UNIX 时间戳的形式返回。 1261 */ 1262 public static QueryColumn unixTimestamp(String columnD) { 1263 return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD); 1264 } 1265 1266 /** 1267 * 将时间 d 以 UNIX 时间戳的形式返回。 1268 */ 1269 public static QueryColumn unixTimestamp(QueryColumn columnD) { 1270 return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD); 1271 } 1272 1273 /** 1274 * 将时间 d 以 UNIX 时间戳的形式返回。 1275 */ 1276 public static <T> QueryColumn unixTimestamp(LambdaGetter<T> columnD) { 1277 return new FunctionQueryColumn(UNIX_TIMESTAMP, LambdaUtil.getQueryColumn(columnD)); 1278 } 1279 1280 /** 1281 * 把 UNIX 时间戳的时间转换为普通格式的时间。 1282 */ 1283 public static QueryColumn fromUnixTime(String columnD) { 1284 return new FunctionQueryColumn(FROM_UNIXTIME, columnD); 1285 } 1286 1287 /** 1288 * 把 UNIX 时间戳的时间转换为普通格式的时间。 1289 */ 1290 public static QueryColumn fromUnixTime(QueryColumn columnD) { 1291 return new FunctionQueryColumn(FROM_UNIXTIME, columnD); 1292 } 1293 1294 /** 1295 * 把 UNIX 时间戳的时间转换为普通格式的时间。 1296 */ 1297 public static <T> QueryColumn fromUnixTime(LambdaGetter<T> columnD) { 1298 return new FunctionQueryColumn(FROM_UNIXTIME, LambdaUtil.getQueryColumn(columnD)); 1299 } 1300 1301 /** 1302 * 返回 UTC(国际协调时间)日期。 1303 */ 1304 public static QueryColumn utcDate() { 1305 return new FunctionQueryColumn(UTC_DATE); 1306 } 1307 1308 /** 1309 * 返回 UTC 时间。 1310 */ 1311 public static QueryColumn utcTime() { 1312 return new FunctionQueryColumn(UTC_TIME); 1313 } 1314 1315 /** 1316 * 返回日期 d 中的月份值,范围是 1~12。 1317 */ 1318 public static QueryColumn month(String columnD) { 1319 return new FunctionQueryColumn(MONTH, columnD); 1320 } 1321 1322 /** 1323 * 返回日期 d 中的月份值,范围是 1~12。 1324 */ 1325 public static QueryColumn month(QueryColumn columnD) { 1326 return new FunctionQueryColumn(MONTH, columnD); 1327 } 1328 1329 /** 1330 * 返回日期 d 中的月份值,范围是 1~12。 1331 */ 1332 public static <T> QueryColumn month(LambdaGetter<T> columnD) { 1333 return new FunctionQueryColumn(MONTH, LambdaUtil.getQueryColumn(columnD)); 1334 } 1335 1336 /** 1337 * 返回日期 d 中的月份名称,如 january。 1338 */ 1339 public static QueryColumn monthName(String columnD) { 1340 return new FunctionQueryColumn(MONTHNAME, columnD); 1341 } 1342 1343 /** 1344 * 返回日期 d 中的月份名称,如 january。 1345 */ 1346 public static QueryColumn monthName(QueryColumn columnD) { 1347 return new FunctionQueryColumn(MONTHNAME, columnD); 1348 } 1349 1350 /** 1351 * 返回日期 d 中的月份名称,如 january。 1352 */ 1353 public static <T> QueryColumn monthName(LambdaGetter<T> columnD) { 1354 return new FunctionQueryColumn(MONTHNAME, LambdaUtil.getQueryColumn(columnD)); 1355 } 1356 1357 /** 1358 * 返回日期 d 是星期几,如 Monday。 1359 */ 1360 public static QueryColumn dayName(String columnD) { 1361 return new FunctionQueryColumn(DAYNAME, columnD); 1362 } 1363 1364 /** 1365 * 返回日期 d 是星期几,如 Monday。 1366 */ 1367 public static QueryColumn dayName(QueryColumn columnD) { 1368 return new FunctionQueryColumn(DAYNAME, columnD); 1369 } 1370 1371 /** 1372 * 返回日期 d 是星期几,如 Monday。 1373 */ 1374 public static <T> QueryColumn dayName(LambdaGetter<T> columnD) { 1375 return new FunctionQueryColumn(DAYNAME, LambdaUtil.getQueryColumn(columnD)); 1376 } 1377 1378 /** 1379 * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 1380 */ 1381 public static QueryColumn dayOfWeek(String columnD) { 1382 return new FunctionQueryColumn(DAYOFWEEK, columnD); 1383 } 1384 1385 /** 1386 * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 1387 */ 1388 public static QueryColumn dayOfWeek(QueryColumn columnD) { 1389 return new FunctionQueryColumn(DAYOFWEEK, columnD); 1390 } 1391 1392 /** 1393 * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 1394 */ 1395 public static <T> QueryColumn dayOfWeek(LambdaGetter<T> columnD) { 1396 return new FunctionQueryColumn(DAYOFWEEK, LambdaUtil.getQueryColumn(columnD)); 1397 } 1398 1399 /** 1400 * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 1401 */ 1402 public static QueryColumn weekday(String columnD) { 1403 return new FunctionQueryColumn(WEEKDAY, columnD); 1404 } 1405 1406 /** 1407 * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 1408 */ 1409 public static QueryColumn weekday(QueryColumn columnD) { 1410 return new FunctionQueryColumn(WEEKDAY, columnD); 1411 } 1412 1413 /** 1414 * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 1415 */ 1416 public static <T> QueryColumn weekday(LambdaGetter<T> columnD) { 1417 return new FunctionQueryColumn(WEEKDAY, LambdaUtil.getQueryColumn(columnD)); 1418 } 1419 1420 /** 1421 * 计算日期 d 是本年的第几个星期,范围是 0-53。 1422 */ 1423 public static QueryColumn week(String columnD) { 1424 return new FunctionQueryColumn(WEEK, columnD); 1425 } 1426 1427 /** 1428 * 计算日期 d 是本年的第几个星期,范围是 0-53。 1429 */ 1430 public static QueryColumn week(QueryColumn columnD) { 1431 return new FunctionQueryColumn(WEEK, columnD); 1432 } 1433 1434 /** 1435 * 计算日期 d 是本年的第几个星期,范围是 0-53。 1436 */ 1437 public static <T> QueryColumn week(LambdaGetter<T> columnD) { 1438 return new FunctionQueryColumn(WEEK, LambdaUtil.getQueryColumn(columnD)); 1439 } 1440 1441 /** 1442 * 计算日期 d 是本年的第几个星期,范围是 1-53。 1443 */ 1444 public static QueryColumn weekOfYear(String columnD) { 1445 return new FunctionQueryColumn(WEEKOFYEAR, columnD); 1446 } 1447 1448 /** 1449 * 计算日期 d 是本年的第几个星期,范围是 1-53。 1450 */ 1451 public static QueryColumn weekOfYear(QueryColumn columnD) { 1452 return new FunctionQueryColumn(WEEKOFYEAR, columnD); 1453 } 1454 1455 /** 1456 * 计算日期 d 是本年的第几个星期,范围是 1-53。 1457 */ 1458 public static <T> QueryColumn weekOfYear(LambdaGetter<T> columnD) { 1459 return new FunctionQueryColumn(WEEKOFYEAR, LambdaUtil.getQueryColumn(columnD)); 1460 } 1461 1462 /** 1463 * 计算日期 d 是本年的第几天。 1464 */ 1465 public static QueryColumn dayOfYear(String columnD) { 1466 return new FunctionQueryColumn(DAYOFYEAR, columnD); 1467 } 1468 1469 /** 1470 * 计算日期 d 是本年的第几天。 1471 */ 1472 public static QueryColumn dayOfYear(QueryColumn columnD) { 1473 return new FunctionQueryColumn(DAYOFYEAR, columnD); 1474 } 1475 1476 /** 1477 * 计算日期 d 是本年的第几天。 1478 */ 1479 public static <T> QueryColumn dayOfYear(LambdaGetter<T> columnD) { 1480 return new FunctionQueryColumn(DAYOFYEAR, LambdaUtil.getQueryColumn(columnD)); 1481 } 1482 1483 /** 1484 * 计算日期 d 是本月的第几天。 1485 */ 1486 public static QueryColumn dayOfMonth(String columnD) { 1487 return new FunctionQueryColumn(DAYOFMONTH, columnD); 1488 } 1489 1490 /** 1491 * 计算日期 d 是本月的第几天。 1492 */ 1493 public static QueryColumn dayOfMonth(QueryColumn columnD) { 1494 return new FunctionQueryColumn(DAYOFMONTH, columnD); 1495 } 1496 1497 /** 1498 * 计算日期 d 是本月的第几天。 1499 */ 1500 public static <T> QueryColumn dayOfMonth(LambdaGetter<T> columnD) { 1501 return new FunctionQueryColumn(DAYOFMONTH, LambdaUtil.getQueryColumn(columnD)); 1502 } 1503 1504 /** 1505 * 返回日期 d 中的年份值。 1506 */ 1507 public static QueryColumn year(String columnD) { 1508 return new FunctionQueryColumn(YEAR, columnD); 1509 } 1510 1511 /** 1512 * 返回日期 d 中的年份值。 1513 */ 1514 public static QueryColumn year(QueryColumn columnD) { 1515 return new FunctionQueryColumn(YEAR, columnD); 1516 } 1517 1518 /** 1519 * 返回日期 d 中的年份值。 1520 */ 1521 public static <T> QueryColumn year(LambdaGetter<T> columnD) { 1522 return new FunctionQueryColumn(YEAR, LambdaUtil.getQueryColumn(columnD)); 1523 } 1524 1525 /** 1526 * 返回日期 d 中的天数值。 1527 */ 1528 public static FunctionQueryColumn day(String columnD) { 1529 return new FunctionQueryColumn(DAY, columnD); 1530 } 1531 1532 /** 1533 * 返回日期 d 中的天数值。 1534 */ 1535 public static FunctionQueryColumn day(QueryColumn columnD) { 1536 return new FunctionQueryColumn(DAY, columnD); 1537 } 1538 1539 /** 1540 * 返回日期 d 中的天数值。 1541 */ 1542 public static <T> FunctionQueryColumn day(LambdaGetter<T> columnD) { 1543 return new FunctionQueryColumn(DAY, LambdaUtil.getQueryColumn(columnD)); 1544 } 1545 1546 /** 1547 * 返回日期 d 是第几季度,范围 1-4。 1548 */ 1549 public static QueryColumn quarter(String columnD) { 1550 return new FunctionQueryColumn(QUARTER, columnD); 1551 } 1552 1553 /** 1554 * 返回日期 d 是第几季度,范围 1-4。 1555 */ 1556 public static QueryColumn quarter(QueryColumn columnD) { 1557 return new FunctionQueryColumn(QUARTER, columnD); 1558 } 1559 1560 /** 1561 * 返回日期 d 是第几季度,范围 1-4。 1562 */ 1563 public static <T> QueryColumn quarter(LambdaGetter<T> columnD) { 1564 return new FunctionQueryColumn(QUARTER, LambdaUtil.getQueryColumn(columnD)); 1565 } 1566 1567 /** 1568 * 返回时间 t 中的小时值。 1569 */ 1570 public static QueryColumn hour(String columnT) { 1571 return new FunctionQueryColumn(HOUR, columnT); 1572 } 1573 1574 /** 1575 * 返回时间 t 中的小时值。 1576 */ 1577 public static QueryColumn hour(QueryColumn columnT) { 1578 return new FunctionQueryColumn(HOUR, columnT); 1579 } 1580 1581 /** 1582 * 返回时间 t 中的小时值。 1583 */ 1584 public static <T> QueryColumn hour(LambdaGetter<T> columnT) { 1585 return new FunctionQueryColumn(HOUR, LambdaUtil.getQueryColumn(columnT)); 1586 } 1587 1588 /** 1589 * 返回时间 t 中的分钟值。 1590 */ 1591 public static QueryColumn minute(String columnT) { 1592 return new FunctionQueryColumn(MINUTE, columnT); 1593 } 1594 1595 /** 1596 * 返回时间 t 中的分钟值。 1597 */ 1598 public static QueryColumn minute(QueryColumn columnT) { 1599 return new FunctionQueryColumn(MINUTE, columnT); 1600 } 1601 1602 /** 1603 * 返回时间 t 中的分钟值。 1604 */ 1605 public static <T> QueryColumn minute(LambdaGetter<T> columnT) { 1606 return new FunctionQueryColumn(MINUTE, LambdaUtil.getQueryColumn(columnT)); 1607 } 1608 1609 /** 1610 * 返回时间 t 中的秒钟值。 1611 */ 1612 public static QueryColumn second(String columnT) { 1613 return new FunctionQueryColumn(SECOND, columnT); 1614 } 1615 1616 /** 1617 * 返回时间 t 中的秒钟值。 1618 */ 1619 public static QueryColumn second(QueryColumn columnT) { 1620 return new FunctionQueryColumn(SECOND, columnT); 1621 } 1622 1623 /** 1624 * 返回时间 t 中的秒钟值。 1625 */ 1626 public static <T> QueryColumn second(LambdaGetter<T> columnT) { 1627 return new FunctionQueryColumn(SECOND, LambdaUtil.getQueryColumn(columnT)); 1628 } 1629 1630 /** 1631 * 将时间 t 转换为秒。 1632 */ 1633 public static QueryColumn timeToSec(String columnT) { 1634 return new FunctionQueryColumn(TIME_TO_SEC, columnT); 1635 } 1636 1637 /** 1638 * 将时间 t 转换为秒。 1639 */ 1640 public static QueryColumn timeToSec(QueryColumn columnT) { 1641 return new FunctionQueryColumn(TIME_TO_SEC, columnT); 1642 } 1643 1644 /** 1645 * 将时间 t 转换为秒。 1646 */ 1647 public static <T> QueryColumn timeToSec(LambdaGetter<T> columnT) { 1648 return new FunctionQueryColumn(TIME_TO_SEC, LambdaUtil.getQueryColumn(columnT)); 1649 } 1650 1651 /** 1652 * 将以秒为单位的时间 s 转换为时分秒的格式。 1653 */ 1654 public static QueryColumn secToTime(String columnS) { 1655 return new FunctionQueryColumn(SEC_TO_TIME, columnS); 1656 } 1657 1658 /** 1659 * 将以秒为单位的时间 s 转换为时分秒的格式。 1660 */ 1661 public static QueryColumn secToTime(QueryColumn columnS) { 1662 return new FunctionQueryColumn(SEC_TO_TIME, columnS); 1663 } 1664 1665 /** 1666 * 将以秒为单位的时间 s 转换为时分秒的格式。 1667 */ 1668 public static <T> QueryColumn secToTime(LambdaGetter<T> columnS) { 1669 return new FunctionQueryColumn(SEC_TO_TIME, LambdaUtil.getQueryColumn(columnS)); 1670 } 1671 1672 /** 1673 * 计算日期 d 到 0000 年 1 月 1 日的天数。 1674 */ 1675 public static QueryColumn toDays(String columnD) { 1676 return new FunctionQueryColumn(TO_DAYS, columnD); 1677 } 1678 1679 /** 1680 * 计算日期 d 到 0000 年 1 月 1 日的天数。 1681 */ 1682 public static QueryColumn toDays(QueryColumn columnD) { 1683 return new FunctionQueryColumn(TO_DAYS, columnD); 1684 } 1685 1686 /** 1687 * 计算日期 d 到 0000 年 1 月 1 日的天数。 1688 */ 1689 public static <T> QueryColumn toDays(LambdaGetter<T> columnD) { 1690 return new FunctionQueryColumn(TO_DAYS, LambdaUtil.getQueryColumn(columnD)); 1691 } 1692 1693 /** 1694 * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 1695 */ 1696 public static QueryColumn fromDays(String columnD) { 1697 return new FunctionQueryColumn(FROM_DAYS, columnD); 1698 } 1699 1700 /** 1701 * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 1702 */ 1703 public static QueryColumn fromDays(QueryColumn columnD) { 1704 return new FunctionQueryColumn(FROM_DAYS, columnD); 1705 } 1706 1707 /** 1708 * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 1709 */ 1710 public static <T> QueryColumn fromDays(LambdaGetter<T> columnD) { 1711 return new FunctionQueryColumn(FROM_DAYS, LambdaUtil.getQueryColumn(columnD)); 1712 } 1713 1714 /** 1715 * 计算日期 d1 到 d2 之间相隔的天数。 1716 */ 1717 public static QueryColumn dateDiff(String columnD1, String columnD2) { 1718 return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2); 1719 } 1720 1721 /** 1722 * 计算日期 d1 到 d2 之间相隔的天数。 1723 */ 1724 public static QueryColumn dateDiff(QueryColumn columnD1, QueryColumn columnD2) { 1725 return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2); 1726 } 1727 1728 /** 1729 * 计算日期 d1 到 d2 之间相隔的天数。 1730 */ 1731 public static <D1, D2> QueryColumn dateDiff(LambdaGetter<D1> columnD1, LambdaGetter<D2> columnD2) { 1732 return new FunctionQueryColumn(DATEDIFF, LambdaUtil.getQueryColumn(columnD1), LambdaUtil.getQueryColumn(columnD2)); 1733 } 1734 1735 /** 1736 * 计算开始日期 d 加上 n 天的日期。 1737 */ 1738 public static QueryColumn addDate(String columnD, String columnN) { 1739 return new FunctionQueryColumn(ADDDATE, columnD, columnN); 1740 } 1741 1742 /** 1743 * 计算开始日期 d 加上 n 天的日期。 1744 */ 1745 public static QueryColumn addDate(QueryColumn columnD, QueryColumn columnN) { 1746 return new FunctionQueryColumn(ADDDATE, columnD, columnN); 1747 } 1748 1749 /** 1750 * 计算开始日期 d 加上 n 天的日期。 1751 */ 1752 public static <D, N> QueryColumn addDate(LambdaGetter<D> columnD, LambdaGetter<N> columnN) { 1753 return new FunctionQueryColumn(ADDDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN)); 1754 } 1755 1756 /** 1757 * 计算起始日期 d 减去 n 天的日期。 1758 */ 1759 public static QueryColumn subDate(String columnD, String columnN) { 1760 return new FunctionQueryColumn(SUBDATE, columnD, columnN); 1761 } 1762 1763 /** 1764 * 计算起始日期 d 减去 n 天的日期。 1765 */ 1766 public static QueryColumn subDate(QueryColumn columnD, QueryColumn columnN) { 1767 return new FunctionQueryColumn(SUBDATE, columnD, columnN); 1768 } 1769 1770 /** 1771 * 计算起始日期 d 减去 n 天的日期。 1772 */ 1773 public static <D, N> QueryColumn subDate(LambdaGetter<D> columnD, LambdaGetter<N> columnN) { 1774 return new FunctionQueryColumn(SUBDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN)); 1775 } 1776 1777 /** 1778 * 计算起始时间 t 加上 n 秒的时间。 1779 */ 1780 public static QueryColumn addTime(String columnT, String columnN) { 1781 return new FunctionQueryColumn(ADDTIME, columnT, columnN); 1782 } 1783 1784 /** 1785 * 计算起始时间 t 加上 n 秒的时间。 1786 */ 1787 public static QueryColumn addTime(QueryColumn columnT, QueryColumn columnN) { 1788 return new FunctionQueryColumn(ADDTIME, columnT, columnN); 1789 } 1790 1791 /** 1792 * 计算起始时间 t 加上 n 秒的时间。 1793 */ 1794 public static <T, N> QueryColumn addTime(LambdaGetter<T> columnT, LambdaGetter<N> columnN) { 1795 return new FunctionQueryColumn(ADDTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN)); 1796 } 1797 1798 /** 1799 * 计算起始时间 t 减去 n 秒的时间。 1800 */ 1801 public static QueryColumn subTime(String columnT, String columnN) { 1802 return new FunctionQueryColumn(SUBTIME, columnT, columnN); 1803 } 1804 1805 /** 1806 * 计算起始时间 t 减去 n 秒的时间。 1807 */ 1808 public static QueryColumn subTime(QueryColumn columnT, QueryColumn columnN) { 1809 return new FunctionQueryColumn(SUBTIME, columnT, columnN); 1810 } 1811 1812 /** 1813 * 计算起始时间 t 减去 n 秒的时间。 1814 */ 1815 public static <T, N> QueryColumn subTime(LambdaGetter<T> columnT, LambdaGetter<N> columnN) { 1816 return new FunctionQueryColumn(SUBTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN)); 1817 } 1818 1819 /** 1820 * 按照表达式 f 的要求显示日期 d。 1821 */ 1822 public static QueryColumn dateFormat(String columnD, String format) { 1823 return new FunctionQueryColumn(DATE_FORMAT, string(columnD), string(format)); 1824 } 1825 1826 /** 1827 * 按照表达式 f 的要求显示日期 d。 1828 */ 1829 public static QueryColumn dateFormat(QueryColumn columnD, String format) { 1830 return new FunctionQueryColumn(DATE_FORMAT, columnD, string(format)); 1831 } 1832 1833 /** 1834 * 按照表达式 f 的要求显示日期 d。 1835 */ 1836 public static <D, F> QueryColumn dateFormat(LambdaGetter<D> columnD, String format) { 1837 return new FunctionQueryColumn(DATE_FORMAT, LambdaUtil.getQueryColumn(columnD), string(format)); 1838 } 1839 1840 /** 1841 * 按照表达式 f 的要求显示时间 t。 1842 */ 1843 public static QueryColumn timeFormat(String columnT, String columnF) { 1844 return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF); 1845 } 1846 1847 /** 1848 * 按照表达式 f 的要求显示时间 t。 1849 */ 1850 public static QueryColumn timeFormat(QueryColumn columnT, QueryColumn columnF) { 1851 return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF); 1852 } 1853 1854 /** 1855 * 按照表达式 f 的要求显示时间 t。 1856 */ 1857 public static <T, F> QueryColumn timeFormat(LambdaGetter<T> columnT, LambdaGetter<F> columnF) { 1858 return new FunctionQueryColumn(TIME_FORMAT, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnF)); 1859 } 1860 1861 /** 1862 * 根据字符串 s 获取 type 类型数据的显示格式。 1863 */ 1864 public static QueryColumn getFormat(String columnType, String columnS) { 1865 return new FunctionQueryColumn(GET_FORMAT, columnType, columnS); 1866 } 1867 1868 /** 1869 * 根据字符串 s 获取 type 类型数据的显示格式。 1870 */ 1871 public static QueryColumn getFormat(QueryColumn columnType, QueryColumn columnS) { 1872 return new FunctionQueryColumn(GET_FORMAT, columnType, columnS); 1873 } 1874 1875 /** 1876 * 根据字符串 s 获取 type 类型数据的显示格式。 1877 */ 1878 public static <T, S> QueryColumn getFormat(LambdaGetter<T> columnType, LambdaGetter<S> columnS) { 1879 return new FunctionQueryColumn(GET_FORMAT, LambdaUtil.getQueryColumn(columnType), LambdaUtil.getQueryColumn(columnS)); 1880 } 1881 1882 // === 系统信息函数 === 1883 1884 /** 1885 * 返回数据库的版本号。 1886 */ 1887 public static QueryColumn version() { 1888 return new FunctionQueryColumn(VERSION); 1889 } 1890 1891 /** 1892 * 返回服务器的连接数。 1893 */ 1894 public static QueryColumn connectionId() { 1895 return new FunctionQueryColumn(CONNECTION_ID); 1896 } 1897 1898 /** 1899 * 返回当前数据库名。 1900 */ 1901 public static QueryColumn database() { 1902 return new FunctionQueryColumn(DATABASE); 1903 } 1904 1905 /** 1906 * 返回当前数据库 schema。 1907 */ 1908 public static QueryColumn schema() { 1909 return new FunctionQueryColumn(SCHEMA); 1910 } 1911 1912 /** 1913 * 返回当前用户的名称。 1914 */ 1915 public static QueryColumn user() { 1916 return new FunctionQueryColumn(USER); 1917 } 1918 1919 /** 1920 * 返回字符串 str 的字符集。 1921 */ 1922 public static QueryColumn charset(String columnStr) { 1923 return new FunctionQueryColumn(CHARSET, columnStr); 1924 } 1925 1926 /** 1927 * 返回字符串 str 的字符集。 1928 */ 1929 public static QueryColumn charset(QueryColumn columnStr) { 1930 return new FunctionQueryColumn(CHARSET, columnStr); 1931 } 1932 1933 /** 1934 * 返回字符串 str 的字符集。 1935 */ 1936 public static <T> QueryColumn charset(LambdaGetter<T> columnStr) { 1937 return new FunctionQueryColumn(CHARSET, LambdaUtil.getQueryColumn(columnStr)); 1938 } 1939 1940 /** 1941 * 返回字符串 str 的字符排列方式。 1942 */ 1943 public static QueryColumn collation(String columnStr) { 1944 return new FunctionQueryColumn(COLLATION, columnStr); 1945 } 1946 1947 /** 1948 * 返回字符串 str 的字符排列方式。 1949 */ 1950 public static QueryColumn collation(QueryColumn columnStr) { 1951 return new FunctionQueryColumn(COLLATION, columnStr); 1952 } 1953 1954 /** 1955 * 返回字符串 str 的字符排列方式。 1956 */ 1957 public static <T> QueryColumn collation(LambdaGetter<T> columnStr) { 1958 return new FunctionQueryColumn(COLLATION, LambdaUtil.getQueryColumn(columnStr)); 1959 } 1960 1961 /** 1962 * 返回最后生成的 auto_increment 值。 1963 */ 1964 public static QueryColumn lastInsertId() { 1965 return new FunctionQueryColumn(LAST_INSERT_ID); 1966 } 1967 1968 // === 加密函数 === 1969 1970 /** 1971 * 对字符串 str 进行加密。 1972 */ 1973 public static QueryColumn password(String columnStr) { 1974 return new FunctionQueryColumn(PASSWORD, columnStr); 1975 } 1976 1977 /** 1978 * 对字符串 str 进行加密。 1979 */ 1980 public static QueryColumn password(QueryColumn columnStr) { 1981 return new FunctionQueryColumn(PASSWORD, columnStr); 1982 } 1983 1984 /** 1985 * 对字符串 str 进行加密。 1986 */ 1987 public static <T> QueryColumn password(LambdaGetter<T> columnStr) { 1988 return new FunctionQueryColumn(PASSWORD, LambdaUtil.getQueryColumn(columnStr)); 1989 } 1990 1991 /** 1992 * 对字符串 str 进行加密。 1993 */ 1994 public static QueryColumn md5(String columnStr) { 1995 return new FunctionQueryColumn(MD5, columnStr); 1996 } 1997 1998 /** 1999 * 对字符串 str 进行加密。 2000 */ 2001 public static QueryColumn md5(QueryColumn columnStr) { 2002 return new FunctionQueryColumn(MD5, columnStr); 2003 } 2004 2005 /** 2006 * 对字符串 str 进行加密。 2007 */ 2008 public static <T> QueryColumn md5(LambdaGetter<T> columnStr) { 2009 return new FunctionQueryColumn(MD5, LambdaUtil.getQueryColumn(columnStr)); 2010 } 2011 2012 /** 2013 * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 2014 */ 2015 public static QueryColumn encode(String columnStr, String columnPswdStr) { 2016 return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr); 2017 } 2018 2019 /** 2020 * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 2021 */ 2022 public static QueryColumn encode(QueryColumn columnStr, QueryColumn columnPswdStr) { 2023 return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr); 2024 } 2025 2026 /** 2027 * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 2028 */ 2029 public static <S, P> QueryColumn encode(LambdaGetter<S> columnStr, LambdaGetter<P> columnPswdStr) { 2030 return new FunctionQueryColumn(ENCODE, LambdaUtil.getQueryColumn(columnStr), LambdaUtil.getQueryColumn(columnPswdStr)); 2031 } 2032 2033 /** 2034 * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 2035 */ 2036 public static QueryColumn decode(String columnCryptStr, String columnPswdStr) { 2037 return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr); 2038 } 2039 2040 /** 2041 * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 2042 */ 2043 public static QueryColumn decode(QueryColumn columnCryptStr, QueryColumn columnPswdStr) { 2044 return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr); 2045 } 2046 2047 /** 2048 * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 2049 */ 2050 public static <C, P> QueryColumn decode(LambdaGetter<C> columnCryptStr, LambdaGetter<P> columnPswdStr) { 2051 return new FunctionQueryColumn(DECODE, LambdaUtil.getQueryColumn(columnCryptStr), LambdaUtil.getQueryColumn(columnPswdStr)); 2052 } 2053 2054 // === 其他函数 === 2055 2056 /** 2057 * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 2058 */ 2059 public static QueryColumn format(String columnX, String columnN) { 2060 return new FunctionQueryColumn(FORMAT, columnX, columnN); 2061 } 2062 2063 /** 2064 * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 2065 */ 2066 public static QueryColumn format(QueryColumn columnX, QueryColumn columnN) { 2067 return new FunctionQueryColumn(FORMAT, columnX, columnN); 2068 } 2069 2070 /** 2071 * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 2072 */ 2073 public static <X, N> QueryColumn format(LambdaGetter<X> columnX, LambdaGetter<N> columnN) { 2074 return new FunctionQueryColumn(FORMAT, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnN)); 2075 } 2076 2077 /** 2078 * 返回字符串 s 的第一个字符的 ASSCII 码。 2079 */ 2080 public static QueryColumn ascii(String columnS) { 2081 return new FunctionQueryColumn(ASCII, columnS); 2082 } 2083 2084 /** 2085 * 返回字符串 s 的第一个字符的 ASSCII 码。 2086 */ 2087 public static QueryColumn ascii(QueryColumn columnS) { 2088 return new FunctionQueryColumn(ASCII, columnS); 2089 } 2090 2091 /** 2092 * 返回字符串 s 的第一个字符的 ASSCII 码。 2093 */ 2094 public static <T> QueryColumn ascii(LambdaGetter<T> columnS) { 2095 return new FunctionQueryColumn(ASCII, LambdaUtil.getQueryColumn(columnS)); 2096 } 2097 2098 /** 2099 * 返回 x 的二进制编码。 2100 */ 2101 public static QueryColumn bin(String columnX) { 2102 return new FunctionQueryColumn(BIN, columnX); 2103 } 2104 2105 /** 2106 * 返回 x 的二进制编码。 2107 */ 2108 public static QueryColumn bin(QueryColumn columnX) { 2109 return new FunctionQueryColumn(BIN, columnX); 2110 } 2111 2112 /** 2113 * 返回 x 的二进制编码。 2114 */ 2115 public static <T> QueryColumn bin(LambdaGetter<T> columnX) { 2116 return new FunctionQueryColumn(BIN, LambdaUtil.getQueryColumn(columnX)); 2117 } 2118 2119 /** 2120 * 返回 x 的十六进制编码。 2121 */ 2122 public static QueryColumn hex(String columnX) { 2123 return new FunctionQueryColumn(HEX, columnX); 2124 } 2125 2126 /** 2127 * 返回 x 的十六进制编码。 2128 */ 2129 public static QueryColumn hex(QueryColumn columnX) { 2130 return new FunctionQueryColumn(HEX, columnX); 2131 } 2132 2133 /** 2134 * 返回 x 的十六进制编码。 2135 */ 2136 public static <T> QueryColumn hex(LambdaGetter<T> columnX) { 2137 return new FunctionQueryColumn(HEX, LambdaUtil.getQueryColumn(columnX)); 2138 } 2139 2140 /** 2141 * 返回 x 的八进制编码。 2142 */ 2143 public static QueryColumn oct(String columnX) { 2144 return new FunctionQueryColumn(OCT, columnX); 2145 } 2146 2147 /** 2148 * 返回 x 的八进制编码。 2149 */ 2150 public static QueryColumn oct(QueryColumn columnX) { 2151 return new FunctionQueryColumn(OCT, columnX); 2152 } 2153 2154 /** 2155 * 返回 x 的八进制编码。 2156 */ 2157 public static <T> QueryColumn oct(LambdaGetter<T> columnX) { 2158 return new FunctionQueryColumn(OCT, LambdaUtil.getQueryColumn(columnX)); 2159 } 2160 2161 /** 2162 * 将 x 从 f1 进制数变成 f2 进制数。 2163 */ 2164 public static QueryColumn conv(String columnX, String columnF1, String columnF2) { 2165 return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2); 2166 } 2167 2168 /** 2169 * 将 x 从 f1 进制数变成 f2 进制数。 2170 */ 2171 public static QueryColumn conv(QueryColumn columnX, QueryColumn columnF1, QueryColumn columnF2) { 2172 return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2); 2173 } 2174 2175 /** 2176 * 将 x 从 f1 进制数变成 f2 进制数。 2177 */ 2178 public static <X, F1, F2> QueryColumn conv(LambdaGetter<X> columnX, LambdaGetter<F1> columnF1, LambdaGetter<F2> columnF2) { 2179 return new FunctionQueryColumn(CONV, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnF1), LambdaUtil.getQueryColumn(columnF2)); 2180 } 2181 2182 /** 2183 * 将 IP 地址转换为数字表示,IP 值需要加上引号。 2184 */ 2185 public static QueryColumn inetAton(String columnIP) { 2186 return new FunctionQueryColumn(INET_ATON, columnIP); 2187 } 2188 2189 /** 2190 * 将 IP 地址转换为数字表示,IP 值需要加上引号。 2191 */ 2192 public static QueryColumn inetAton(QueryColumn columnIP) { 2193 return new FunctionQueryColumn(INET_ATON, columnIP); 2194 } 2195 2196 /** 2197 * 将 IP 地址转换为数字表示,IP 值需要加上引号。 2198 */ 2199 public static <T> QueryColumn inetAton(LambdaGetter<T> columnIP) { 2200 return new FunctionQueryColumn(INET_ATON, LambdaUtil.getQueryColumn(columnIP)); 2201 } 2202 2203 /** 2204 * 可以将数字 n 转换成 IP 的形式。 2205 */ 2206 public static QueryColumn inetNtoa(String columnN) { 2207 return new FunctionQueryColumn(INET_NTOA, columnN); 2208 } 2209 2210 /** 2211 * 可以将数字 n 转换成 IP 的形式。 2212 */ 2213 public static QueryColumn inetNtoa(QueryColumn columnN) { 2214 return new FunctionQueryColumn(INET_NTOA, columnN); 2215 } 2216 2217 /** 2218 * 可以将数字 n 转换成 IP 的形式。 2219 */ 2220 public static <T> QueryColumn inetNtoa(LambdaGetter<T> columnN) { 2221 return new FunctionQueryColumn(INET_NTOA, LambdaUtil.getQueryColumn(columnN)); 2222 } 2223 2224 // === 聚合函数 === 2225 2226 /** 2227 * 返回指定列的最大值。 2228 */ 2229 public static FunctionQueryColumn max(String column) { 2230 return new FunctionQueryColumn(MAX, column); 2231 } 2232 2233 /** 2234 * 返回指定列的最大值。 2235 */ 2236 public static FunctionQueryColumn max(QueryColumn column) { 2237 return new FunctionQueryColumn(MAX, column); 2238 } 2239 2240 /** 2241 * 返回指定列的最大值。 2242 */ 2243 public static <T> FunctionQueryColumn max(LambdaGetter<T> column) { 2244 return new FunctionQueryColumn(MAX, LambdaUtil.getQueryColumn(column)); 2245 } 2246 2247 /** 2248 * 返回指定列的最小值。 2249 */ 2250 public static FunctionQueryColumn min(String column) { 2251 return new FunctionQueryColumn(MIN, column); 2252 } 2253 2254 /** 2255 * 返回指定列的最小值。 2256 */ 2257 public static FunctionQueryColumn min(QueryColumn column) { 2258 return new FunctionQueryColumn(MIN, column); 2259 } 2260 2261 /** 2262 * 返回指定列的最小值。 2263 */ 2264 public static <T> FunctionQueryColumn min(LambdaGetter<T> column) { 2265 return new FunctionQueryColumn(MIN, LambdaUtil.getQueryColumn(column)); 2266 } 2267 2268 /** 2269 * 返回指定列的平均值。 2270 */ 2271 public static FunctionQueryColumn avg(String column) { 2272 return new FunctionQueryColumn(AVG, column); 2273 } 2274 2275 /** 2276 * 返回指定列的平均值。 2277 */ 2278 public static FunctionQueryColumn avg(QueryColumn column) { 2279 return new FunctionQueryColumn(AVG, column); 2280 } 2281 2282 /** 2283 * 返回指定列的平均值。 2284 */ 2285 public static <T> FunctionQueryColumn avg(LambdaGetter<T> column) { 2286 return new FunctionQueryColumn(AVG, LambdaUtil.getQueryColumn(column)); 2287 } 2288 2289 /** 2290 * 返回指定字段值的和。 2291 */ 2292 public static FunctionQueryColumn sum(String column) { 2293 return new FunctionQueryColumn(SUM, column); 2294 } 2295 2296 /** 2297 * 返回指定字段值的和。 2298 */ 2299 public static FunctionQueryColumn sum(QueryColumn column) { 2300 return new FunctionQueryColumn(SUM, column); 2301 } 2302 2303 /** 2304 * 返回指定字段值的和。 2305 */ 2306 public static <T> FunctionQueryColumn sum(LambdaGetter<T> column) { 2307 return new FunctionQueryColumn(SUM, LambdaUtil.getQueryColumn(column)); 2308 } 2309 2310 // === COUNT === 2311 2312 /** 2313 * 返回指定列的总行数。 2314 */ 2315 public static FunctionQueryColumn count() { 2316 return new FunctionQueryColumn(COUNT, new RawQueryColumn("*")); 2317 } 2318 2319 /** 2320 * 返回指定列的总行数。 2321 */ 2322 public static FunctionQueryColumn count(String column) { 2323 return new FunctionQueryColumn(COUNT, column); 2324 } 2325 2326 /** 2327 * 返回指定列的总行数。 2328 */ 2329 public static FunctionQueryColumn count(QueryColumn column) { 2330 return new FunctionQueryColumn(COUNT, column); 2331 } 2332 2333 /** 2334 * 返回指定列的总行数。 2335 */ 2336 public static <T> FunctionQueryColumn count(LambdaGetter<T> column) { 2337 return new FunctionQueryColumn(COUNT, LambdaUtil.getQueryColumn(column)); 2338 } 2339 2340 2341 // === DISTINCT === 2342 2343 /** 2344 * 对指定列进行去重。 2345 */ 2346 public static DistinctQueryColumn distinct(QueryColumn... columns) { 2347 return new DistinctQueryColumn(columns); 2348 } 2349 2350 @SafeVarargs 2351 public static <T> DistinctQueryColumn distinct(LambdaGetter<T>... columns) { 2352 return new DistinctQueryColumn(Arrays.stream(columns) 2353 .map(LambdaUtil::getQueryColumn).toArray(QueryColumn[]::new)); 2354 } 2355 2356 // === CASE THEN ELSE === 2357 2358 /** 2359 * 构建 case then when 语句。 2360 */ 2361 public static CaseQueryColumn.Builder case_() { 2362 return new CaseQueryColumn.Builder(); 2363 } 2364 2365 /** 2366 * 构建 case then when 语句。 2367 */ 2368 public static CaseSearchQueryColumn.Builder case_(QueryColumn column) { 2369 return new CaseSearchQueryColumn.Builder(column); 2370 } 2371 2372 // === CONVERT === 2373 2374 /** 2375 * 将所给类型类型转换为另一种类型。 2376 */ 2377 public static StringFunctionQueryColumn convert(String... params) { 2378 return new StringFunctionQueryColumn(CONVERT, params); 2379 } 2380 2381 // === 构建 column 列 === 2382 2383 /** 2384 * 构建 TRUE 常量。 2385 */ 2386 public static QueryColumn true_() { 2387 return new RawQueryColumn("TRUE"); 2388 } 2389 2390 /** 2391 * 构建 FALSE 常量。 2392 */ 2393 public static QueryColumn false_() { 2394 return new RawQueryColumn("FALSE"); 2395 } 2396 2397 /** 2398 * 构建 NULL 常量。 2399 */ 2400 public static QueryColumn null_() { 2401 return new RawQueryColumn("NULL"); 2402 } 2403 2404 /** 2405 * 构建数字常量。 2406 */ 2407 public static QueryColumn number(Number n) { 2408 return new RawQueryColumn(n); 2409 } 2410 2411 /** 2412 * 构建数字常量。 2413 */ 2414 public static QueryColumn string(String s) { 2415 return new RawQueryColumn("'" + s + "'"); 2416 } 2417 2418 /** 2419 * 构建相反数。 2420 */ 2421 public static QueryColumn negative(QueryColumn queryColumn) { 2422 return new NegativeQueryColumn(queryColumn); 2423 } 2424 2425 /** 2426 * 构建自定义列。 2427 */ 2428 public static QueryColumn column(String column, Object... params) { 2429 return new RawQueryColumn(column, params); 2430 } 2431 2432 /** 2433 * 构建自定义列。 2434 */ 2435 public static QueryColumn column(String table, String column) { 2436 return new QueryColumn(table, column); 2437 } 2438 2439 /** 2440 * 构建自定义列。 2441 */ 2442 public static QueryColumn column(String schema, String table, String column) { 2443 return new QueryColumn(schema, table, column); 2444 } 2445 2446 /** 2447 * 构建自定义列。 2448 */ 2449 public static <T> QueryColumn column(LambdaGetter<T> column) { 2450 return LambdaUtil.getQueryColumn(column); 2451 } 2452 2453 /** 2454 * 构建自定义列。 2455 */ 2456 public static QueryColumn column(QueryWrapper queryWrapper) { 2457 return new SelectQueryColumn(queryWrapper); 2458 } 2459 2460 /** 2461 * 构建所有列。 2462 */ 2463 public static QueryColumn allColumns() { 2464 return column("*"); 2465 } 2466 2467 /** 2468 * 构建所有列。 2469 */ 2470 public static Iterable<QueryColumn> allColumns(Class<?>... classes) { 2471 List<QueryColumn> queryColumns = new ArrayList<>(classes.length); 2472 for (Class<?> aClass : classes) { 2473 TableInfo tableInfo = TableInfoFactory.ofEntityClass(aClass); 2474 QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()); 2475 queryColumns.add(new QueryColumn(queryTable, "*")); 2476 } 2477 return queryColumns; 2478 } 2479 2480 /** 2481 * 构建默认列。 2482 */ 2483 public static Iterable<QueryColumn> defaultColumns(Class<?>... classes) { 2484 List<QueryColumn> queryColumns = new ArrayList<>(); 2485 for (Class<?> aClass : classes) { 2486 TableInfo tableInfo = TableInfoFactory.ofEntityClass(aClass); 2487 queryColumns.addAll(tableInfo.getDefaultQueryColumn()); 2488 } 2489 return queryColumns; 2490 } 2491 2492 // === IF 函数 === 2493 2494 /** 2495 * IF 函数。 2496 */ 2497 public static QueryColumn if_(QueryCondition condition, String trueColumn, String falseColumn) { 2498 return new IfFunctionQueryColumn(condition, new QueryColumn(trueColumn), new QueryColumn(falseColumn)); 2499 } 2500 2501 /** 2502 * IF 函数。 2503 */ 2504 public static QueryColumn if_(QueryCondition condition, QueryColumn trueColumn, QueryColumn falseColumn) { 2505 return new IfFunctionQueryColumn(condition, trueColumn, falseColumn); 2506 } 2507 2508 /** 2509 * IF 函数。 2510 */ 2511 public static <T, F> QueryColumn if_(QueryCondition condition, LambdaGetter<T> trueColumn, LambdaGetter<F> falseColumn) { 2512 return new IfFunctionQueryColumn(condition, LambdaUtil.getQueryColumn(trueColumn), LambdaUtil.getQueryColumn(falseColumn)); 2513 } 2514 2515 /** 2516 * IFNULL 函数。 2517 */ 2518 public static QueryColumn ifNull(String nullColumn, String elseColumn) { 2519 return new FunctionQueryColumn("IFNULL", new QueryColumn(nullColumn), new QueryColumn(elseColumn)); 2520 } 2521 2522 /** 2523 * IFNULL 函数。 2524 */ 2525 public static QueryColumn ifNull(QueryColumn nullColumn, QueryColumn elseColumn) { 2526 return new FunctionQueryColumn("IFNULL", nullColumn, elseColumn); 2527 } 2528 2529 /** 2530 * IFNULL 函数。 2531 */ 2532 public static <N, E> QueryColumn ifNull(LambdaGetter<N> nullColumn, LambdaGetter<E> elseColumn) { 2533 return new FunctionQueryColumn("IFNULL", LambdaUtil.getQueryColumn(nullColumn), LambdaUtil.getQueryColumn(elseColumn)); 2534 } 2535 2536 /** 2537 * IFNULL 函数。 2538 */ 2539 public static <N> QueryColumn ifNull(LambdaGetter<N> nullColumn, QueryColumn elseColumn) { 2540 return ifNull(LambdaUtil.getQueryColumn(nullColumn), elseColumn); 2541 } 2542 2543 /** 2544 * IFNULL 函数。 2545 */ 2546 public static <N> QueryColumn ifNull(LambdaGetter<N> nullColumn, String elseColumn) { 2547 return ifNull(nullColumn, new QueryColumn(elseColumn)); 2548 } 2549 2550 2551 // === 构建 QueryCondition 查询条件 === 2552 2553 /** 2554 * EXIST (SELECT ...) 2555 */ 2556 public static QueryCondition exists(QueryWrapper queryWrapper) { 2557 return new OperatorSelectCondition("EXISTS ", queryWrapper); 2558 } 2559 2560 /** 2561 * NOT EXIST (SELECT ...) 2562 */ 2563 public static QueryCondition notExists(QueryWrapper queryWrapper) { 2564 return new OperatorSelectCondition("NOT EXISTS ", queryWrapper); 2565 } 2566 2567 /** 2568 * NOT (id = 1) 2569 */ 2570 public static QueryCondition not(QueryCondition childCondition) { 2571 return new OperatorQueryCondition("NOT ", childCondition); 2572 } 2573 2574 /** 2575 * {@code NOT (column)} 或 {@code NOT column} 2576 */ 2577 public static <N> QueryColumn not(LambdaGetter<N> column) { 2578 return new FunctionQueryColumn("NOT", LambdaUtil.getQueryColumn(column)); 2579 } 2580 2581 /** 2582 * 空条件。 2583 */ 2584 public static QueryCondition noCondition() { 2585 return QueryCondition.createEmpty(); 2586 } 2587 2588 /** 2589 * 括号条件。 2590 */ 2591 public static QueryCondition bracket(QueryCondition condition) { 2592 return new Brackets(condition); 2593 } 2594 2595 // === 构建 QueryWrapper 查询 === 2596 2597 /** 2598 * SELECT queryColumns FROM table 2599 */ 2600 public static QueryWrapper select(QueryColumn... queryColumns) { 2601 return newWrapper().select(queryColumns); 2602 } 2603 2604 /** 2605 * SELECT * FROM table UNION SELECT ... 2606 */ 2607 public static QueryWrapper union(QueryWrapper queryWrapper) { 2608 return newWrapper().union(queryWrapper); 2609 } 2610 2611 /** 2612 * SELECT 1 as temp_one FROM table 2613 */ 2614 public static QueryWrapper selectOne() { 2615 return select(column("1").as("temp_one")); 2616 } 2617 2618 /** 2619 * SELECT COUNT(*) as temp_count FROM table 2620 */ 2621 public static QueryWrapper selectCount() { 2622 return select(count().as("temp_count")); 2623 } 2624 2625 /** 2626 * SELECT COUNT(1) as temp_count_one FROM table 2627 */ 2628 public static QueryWrapper selectCountOne() { 2629 return select(count(new RawQueryColumn("1")).as("temp_count_one")); 2630 } 2631 2632 /** 2633 * SELECT * FROM table 2634 */ 2635 private static QueryWrapper newWrapper() { 2636 return new QueryWrapper(); 2637 } 2638 2639 // 构建原生 SQL 条件 2640 2641 /** 2642 * 构建原生查询条件。 2643 */ 2644 public static QueryCondition raw(String raw) { 2645 return new RawQueryCondition(raw); 2646 } 2647 2648 /** 2649 * 构建原生查询条件,并附带参数。 2650 */ 2651 public static QueryCondition raw(String raw, Object... params) { 2652 return new RawQueryCondition(raw, params); 2653 } 2654 2655 2656 /** 2657 * 分组值拼接 2658 */ 2659 public static QueryColumn groupConcat(QueryColumn columnX) { 2660 return new FunctionQueryColumn(GROUP_CONCAT, columnX); 2661 } 2662 2663 /** 2664 * date 函数 2665 * @return 2666 */ 2667 public static FunctionQueryColumn date(QueryColumn column) { 2668 return new FunctionQueryColumn("DATE", column); 2669 } 2670 2671}