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}