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