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    // === 数学函数 ===
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
684    // === 字符串函数 ===
685
686    /**
687     * 返回字符串 s 的字符数。
688     */
689    public static QueryColumn charLength(String columnS) {
690        return new FunctionQueryColumn(CHAR_LENGTH, columnS);
691    }
692
693    /**
694     * 返回字符串 s 的字符数。
695     */
696    public static QueryColumn charLength(QueryColumn columnS) {
697        return new FunctionQueryColumn(CHAR_LENGTH, columnS);
698    }
699
700    /**
701     * 返回字符串 s 的字符数。
702     */
703    public static <T> QueryColumn charLength(LambdaGetter<T> columnS) {
704        return new FunctionQueryColumn(CHAR_LENGTH, LambdaUtil.getQueryColumn(columnS));
705    }
706
707    /**
708     * 返回字符串 s 的长度。
709     */
710    public static QueryColumn length(String columnS) {
711        return new FunctionQueryColumn(LENGTH, columnS);
712    }
713
714    /**
715     * 返回字符串 s 的长度。
716     */
717    public static QueryColumn length(QueryColumn columnS) {
718        return new FunctionQueryColumn(LENGTH, columnS);
719    }
720
721    /**
722     * 返回字符串 s 的长度。
723     */
724    public static <T> QueryColumn length(LambdaGetter<T> columnS) {
725        return new FunctionQueryColumn(LENGTH, LambdaUtil.getQueryColumn(columnS));
726    }
727
728    /**
729     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
730     */
731    public static QueryColumn concat(String columnS1, String columnS2, String... columnN) {
732        return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new String[]{columnS1, columnS2}, columnN));
733    }
734
735    /**
736     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
737     */
738    public static QueryColumn concat(QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) {
739        return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new QueryColumn[]{columnS1, columnS2}, columnN));
740    }
741
742    /**
743     * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。
744     */
745    public static QueryColumn concatWs(String columnX, String columnS1, String columnS2, String... columnN) {
746        return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new String[]{columnX, columnS1, columnS2}, columnN));
747    }
748
749    /**
750     * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。
751     */
752    public static QueryColumn concatWs(QueryColumn columnX, QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) {
753        return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new QueryColumn[]{columnX, columnS1, columnS2}, columnN));
754    }
755
756    /**
757     * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。
758     */
759    public static QueryColumn insert(String columnS1, String columnX, String columnLen, String columnS2) {
760        return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2);
761    }
762
763    /**
764     * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。
765     */
766    public static QueryColumn insert(QueryColumn columnS1, QueryColumn columnX, QueryColumn columnLen, QueryColumn columnS2) {
767        return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2);
768    }
769
770    /**
771     * 将字符串 s 的所有字符都变成大写字母。
772     */
773    public static QueryColumn upper(String columnS) {
774        return new FunctionQueryColumn(UPPER, columnS);
775    }
776
777    /**
778     * 将字符串 s 的所有字符都变成大写字母。
779     */
780    public static QueryColumn upper(QueryColumn columnS) {
781        return new FunctionQueryColumn(UPPER, columnS);
782    }
783
784    /**
785     * 将字符串 s 的所有字符都变成大写字母。
786     */
787    public static <T> QueryColumn upper(LambdaGetter<T> columnS) {
788        return new FunctionQueryColumn(UPPER, LambdaUtil.getQueryColumn(columnS));
789    }
790
791    /**
792     * 将字符串 s 的所有字符都变成小写字母。
793     */
794    public static QueryColumn lower(String columnS) {
795        return new FunctionQueryColumn(LOWER, columnS);
796    }
797
798    /**
799     * 将字符串 s 的所有字符都变成小写字母。
800     */
801    public static QueryColumn lower(QueryColumn columnS) {
802        return new FunctionQueryColumn(LOWER, columnS);
803    }
804
805    /**
806     * 将字符串 s 的所有字符都变成小写字母。
807     */
808    public static <T> QueryColumn lower(LambdaGetter<T> columnS) {
809        return new FunctionQueryColumn(LOWER, LambdaUtil.getQueryColumn(columnS));
810    }
811
812    /**
813     * 返回字符串 s 的前 n 个字符。
814     */
815    public static QueryColumn left(String columnS, int length) {
816        return new FunctionQueryColumn(LEFT, string(columnS), number(length));
817    }
818
819    /**
820     * 返回字符串 s 的前 n 个字符。
821     */
822    public static QueryColumn left(QueryColumn columnS, int length) {
823        return new FunctionQueryColumn(LEFT, columnS, number(length));
824    }
825
826    /**
827     * 返回字符串 s 的前 n 个字符。
828     */
829    public static <S, N> QueryColumn left(LambdaGetter<S> columnS, int length) {
830        return new FunctionQueryColumn(LEFT, LambdaUtil.getQueryColumn(columnS), number(length));
831    }
832
833
834    /**
835     * 返回字符串 s 的后 length 个字符。
836     */
837    public static QueryColumn right(String columnS, int length) {
838        return new FunctionQueryColumn(RIGHT, string(columnS), number(length));
839    }
840
841    /**
842     * 返回字符串 s 的后 length 个字符。
843     */
844    public static QueryColumn right(QueryColumn columnS, int length) {
845        return new FunctionQueryColumn(RIGHT, columnS, number(length));
846    }
847
848    /**
849     * 返回字符串 s 的后 length 个字符。
850     */
851    public static <S, N> QueryColumn right(LambdaGetter<S> columnS, int length) {
852        return new FunctionQueryColumn(RIGHT, LambdaUtil.getQueryColumn(columnS), number(length));
853    }
854
855    /**
856     * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。
857     */
858    public static QueryColumn lpad(String columnS1, String columnLen, String columnS2) {
859        return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2);
860    }
861
862    /**
863     * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。
864     */
865    public static QueryColumn lpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) {
866        return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2);
867    }
868
869    /**
870     * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。
871     */
872    public static <S1, L, S2> QueryColumn lpad(LambdaGetter<S1> columnS1, LambdaGetter<L> columnLen, LambdaGetter<S2> columnS2) {
873        return new FunctionQueryColumn(LPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2));
874    }
875
876    /**
877     * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。
878     */
879    public static QueryColumn rpad(String columnS1, String columnLen, String columnS2) {
880        return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2);
881    }
882
883    /**
884     * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。
885     */
886    public static QueryColumn rpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) {
887        return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2);
888    }
889
890    /**
891     * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。
892     */
893    public static <S1, L, S2> QueryColumn rpad(LambdaGetter<S1> columnS1, LambdaGetter<L> columnLen, LambdaGetter<S2> columnS2) {
894        return new FunctionQueryColumn(RPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2));
895    }
896
897    /**
898     * 去掉字符串 s 开始处的空格。
899     */
900    public static QueryColumn ltrim(String columnS) {
901        return new FunctionQueryColumn(LTRIM, columnS);
902    }
903
904    /**
905     * 去掉字符串 s 开始处的空格。
906     */
907    public static QueryColumn ltrim(QueryColumn columnS) {
908        return new FunctionQueryColumn(LTRIM, columnS);
909    }
910
911    /**
912     * 去掉字符串 s 开始处的空格。
913     */
914    public static <T> QueryColumn ltrim(LambdaGetter<T> columnS) {
915        return new FunctionQueryColumn(LTRIM, LambdaUtil.getQueryColumn(columnS));
916    }
917
918    /**
919     * 去掉字符串 s 结尾处的空格。
920     */
921    public static QueryColumn rtrim(String columnS) {
922        return new FunctionQueryColumn(RTRIM, columnS);
923    }
924
925    /**
926     * 去掉字符串 s 结尾处的空格。
927     */
928    public static QueryColumn rtrim(QueryColumn columnS) {
929        return new FunctionQueryColumn(RTRIM, columnS);
930    }
931
932    /**
933     * 去掉字符串 s 结尾处的空格。
934     */
935    public static <T> QueryColumn rtrim(LambdaGetter<T> columnS) {
936        return new FunctionQueryColumn(RTRIM, LambdaUtil.getQueryColumn(columnS));
937    }
938
939    /**
940     * 去掉字符串 s 开始处和结尾处的空格。
941     */
942    public static QueryColumn trim(QueryColumn columnS) {
943        return new FunctionQueryColumn(TRIM, columnS);
944    }
945
946    /**
947     * 将字符串 s 重复 n 次。
948     */
949    public static QueryColumn repeat(String columnS, String columnN) {
950        return new FunctionQueryColumn(REPEAT, columnS, columnN);
951    }
952
953    /**
954     * 将字符串 s 重复 n 次。
955     */
956    public static QueryColumn repeat(QueryColumn columnS, QueryColumn columnN) {
957        return new FunctionQueryColumn(REPEAT, columnS, columnN);
958    }
959
960    /**
961     * 将字符串 s 重复 n 次。
962     */
963    public static <S, N> QueryColumn repeat(LambdaGetter<S> columnS, LambdaGetter<N> columnN) {
964        return new FunctionQueryColumn(REPEAT, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN));
965    }
966
967    /**
968     * 将字符串 s 重复 n 次。
969     */
970    public static QueryColumn repeat(String columnX, Integer n) {
971        return new FunctionQueryColumn(REPEAT, new QueryColumn(columnX), number(n));
972    }
973
974    /**
975     * 将字符串 s 重复 n 次。
976     */
977    public static QueryColumn repeat(QueryColumn columnX, Integer n) {
978        return new FunctionQueryColumn(REPEAT, columnX, number(n));
979    }
980
981    /**
982     * 将字符串 s 重复 n 次。
983     */
984    public static <T> QueryColumn repeat(LambdaGetter<T> columnX, Integer n) {
985        return new FunctionQueryColumn(REPEAT, LambdaUtil.getQueryColumn(columnX), number(n));
986    }
987
988    /**
989     * 返回 n 个空格。
990     */
991    public static QueryColumn space(String columnN) {
992        return new FunctionQueryColumn(SPACE, columnN);
993    }
994
995    /**
996     * 返回 n 个空格。
997     */
998    public static QueryColumn space(QueryColumn columnN) {
999        return new FunctionQueryColumn(SPACE, columnN);
1000    }
1001
1002    /**
1003     * 返回 n 个空格。
1004     */
1005    public static <T> QueryColumn space(LambdaGetter<T> columnN) {
1006        return new FunctionQueryColumn(SPACE, LambdaUtil.getQueryColumn(columnN));
1007    }
1008
1009    /**
1010     * 用字符串 s2 代替字符串 s 中的字符串 s1。
1011     */
1012    public static QueryColumn replace(String columnS, String columnS1, String columnS2) {
1013        return new StringFunctionQueryColumn(REPLACE, columnS, columnS1, columnS2);
1014    }
1015
1016    /**
1017     * 用字符串 s2 代替字符串 s 中的字符串 s1。
1018     */
1019    public static QueryColumn replace(QueryColumn columnS, QueryColumn columnS1, QueryColumn columnS2) {
1020        return new FunctionQueryColumn(REPLACE, columnS, columnS1, columnS2);
1021    }
1022
1023    /**
1024     * 用字符串 s2 代替字符串 s 中的字符串 s1。
1025     */
1026    public static <S, S1, S2> QueryColumn replace(LambdaGetter<S> columnS, LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) {
1027        return new FunctionQueryColumn(REPLACE, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2));
1028    }
1029
1030    /**
1031     * 比较字符串 s1 和 s2。
1032     */
1033    public static QueryColumn strcmp(String columnS1, String columnS2) {
1034        return new FunctionQueryColumn(STRCMP, columnS1, columnS2);
1035    }
1036
1037    /**
1038     * 比较字符串 s1 和 s2。
1039     */
1040    public static QueryColumn strcmp(QueryColumn columnS1, QueryColumn columnS2) {
1041        return new FunctionQueryColumn(STRCMP, columnS1, columnS2);
1042    }
1043
1044    /**
1045     * 比较字符串 s1 和 s2。
1046     */
1047    public static <S1, S2> QueryColumn strcmp(LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) {
1048        return new FunctionQueryColumn(STRCMP, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2));
1049    }
1050
1051
1052    /**
1053     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1054     */
1055    public static QueryColumn substring(String columnS, int position) {
1056        return new FunctionQueryColumn(SUBSTRING, string(columnS), number(position));
1057    }
1058
1059    /**
1060     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1061     */
1062    public static QueryColumn substring(QueryColumn columnS, int position) {
1063        return new FunctionQueryColumn(SUBSTRING, columnS, number(position));
1064    }
1065
1066    /**
1067     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1068     */
1069    public static <S, N, L> QueryColumn substring(LambdaGetter<S> columnS, int position) {
1070        return new FunctionQueryColumn(SUBSTRING, LambdaUtil.getQueryColumn(columnS), number(position));
1071    }
1072
1073    /**
1074     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1075     */
1076    public static QueryColumn substring(String columnS, int position, int length) {
1077        return new FunctionQueryColumn(SUBSTRING, string(columnS), number(position), number(length));
1078    }
1079
1080    /**
1081     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1082     */
1083    public static QueryColumn substring(QueryColumn columnS, int position, int length) {
1084        return new FunctionQueryColumn(SUBSTRING, columnS, number(position), number(length));
1085    }
1086
1087    /**
1088     * 获取从字符串 s 中的第 position 个位置开始长度为 length 的字符串。
1089     */
1090    public static <S, N, L> QueryColumn substring(LambdaGetter<S> columnS, int position, int length) {
1091        return new FunctionQueryColumn(SUBSTRING, LambdaUtil.getQueryColumn(columnS), number(position), number(length));
1092    }
1093
1094    /**
1095     * 从字符串 s 中获取 s1 的开始位置。
1096     */
1097    public static QueryColumn instr(String columnS, String columnS1) {
1098        return new FunctionQueryColumn(INSTR, columnS, columnS1);
1099    }
1100
1101    /**
1102     * 从字符串 s 中获取 s1 的开始位置。
1103     */
1104    public static QueryColumn instr(QueryColumn columnS, QueryColumn columnS1) {
1105        return new FunctionQueryColumn(INSTR, columnS, columnS1);
1106    }
1107
1108    /**
1109     * 从字符串 s 中获取 s1 的开始位置。
1110     */
1111    public static <S, S1> QueryColumn instr(LambdaGetter<S> columnS, LambdaGetter<S1> columnS1) {
1112        return new FunctionQueryColumn(INSTR, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1));
1113    }
1114
1115    /**
1116     * 将字符串 s 的顺序反过来。
1117     */
1118    public static QueryColumn reverse(String columnS) {
1119        return new FunctionQueryColumn(REVERSE, columnS);
1120    }
1121
1122    /**
1123     * 将字符串 s 的顺序反过来。
1124     */
1125    public static QueryColumn reverse(QueryColumn columnS) {
1126        return new FunctionQueryColumn(REVERSE, columnS);
1127    }
1128
1129    /**
1130     * 将字符串 s 的顺序反过来。
1131     */
1132    public static <T> QueryColumn reverse(LambdaGetter<T> columnS) {
1133        return new FunctionQueryColumn(REVERSE, LambdaUtil.getQueryColumn(columnS));
1134    }
1135
1136    /**
1137     * 返回第 n 个字符串。
1138     */
1139    public static QueryColumn elt(String columnN, String columnS1, String... columnSn) {
1140        return new FunctionQueryColumn(ELT, ArrayUtil.concat(new String[]{columnN, columnS1}, columnSn));
1141    }
1142
1143    /**
1144     * 返回第 n 个字符串。
1145     */
1146    public static QueryColumn elt(QueryColumn columnN, QueryColumn columnS1, QueryColumn... columnSn) {
1147        return new FunctionQueryColumn(ELT, ArrayUtil.concat(new QueryColumn[]{columnN, columnS1}, columnSn));
1148    }
1149
1150    /**
1151     * 返回第一个与字符串 s 匹配的字符串的位置。
1152     */
1153    public static QueryColumn field(String columnS, String columnS1, String... columnSn) {
1154        return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new String[]{columnS, columnS1}, columnSn));
1155    }
1156
1157    /**
1158     * 返回第一个与字符串 s 匹配的字符串的位置。
1159     */
1160    public static QueryColumn field(QueryColumn columnS, QueryColumn columnS1, QueryColumn... columnSn) {
1161        return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new QueryColumn[]{columnS, columnS1}, columnSn));
1162    }
1163
1164    /**
1165     * 返回在字符串 s2 中与 s1 匹配的字符串的位置。
1166     */
1167    public static QueryColumn findInSet(String columnS1, String columnS2) {
1168        return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2);
1169    }
1170
1171    /**
1172     * 返回在字符串 s2 中与 s1 匹配的字符串的位置。
1173     */
1174    public static QueryColumn findInSet(QueryColumn columnS1, QueryColumn columnS2) {
1175        return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2);
1176    }
1177
1178    /**
1179     * 返回在字符串 s2 中与 s1 匹配的字符串的位置。
1180     */
1181    public static <S1, S2> QueryColumn findInSet(LambdaGetter<S1> columnS1, LambdaGetter<S2> columnS2) {
1182        return new FunctionQueryColumn(FIND_IN_SET, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2));
1183    }
1184
1185    // === 日期时间函数 ===
1186
1187    /**
1188     * 返回当前日期。
1189     */
1190    public static QueryColumn curDate() {
1191        return new FunctionQueryColumn(CURDATE);
1192    }
1193
1194    /**
1195     * 返回当前日期。
1196     */
1197    public static QueryColumn currentDate() {
1198        return new FunctionQueryColumn(CURRENT_DATE);
1199    }
1200
1201    /**
1202     * 返回当前时间。
1203     */
1204    public static QueryColumn curTime() {
1205        return new FunctionQueryColumn(CURTIME);
1206    }
1207
1208    /**
1209     * 返回当前时间。
1210     */
1211    public static QueryColumn currentTime() {
1212        return new FunctionQueryColumn(CURRENT_TIME);
1213    }
1214
1215    /**
1216     * 返回当前日期和时间。
1217     */
1218    public static QueryColumn now() {
1219        return new FunctionQueryColumn(NOW);
1220    }
1221
1222    /**
1223     * SQL SWERVER 返回当前日期和时间。
1224     */
1225    public static QueryColumn getDate() {
1226        return new FunctionQueryColumn(GET_DATE);
1227    }
1228
1229    /**
1230     * 返回当前日期和时间。
1231     */
1232    public static QueryColumn currentTimestamp() {
1233        return new FunctionQueryColumn(CURRENT_TIMESTAMP);
1234    }
1235
1236    /**
1237     * 返回当前日期和时间。
1238     */
1239    public static QueryColumn localTime() {
1240        return new FunctionQueryColumn(LOCALTIME);
1241    }
1242
1243    /**
1244     * 返回当前日期和时间。
1245     */
1246    public static QueryColumn sysDate() {
1247        return new FunctionQueryColumn(SYSDATE);
1248    }
1249
1250
1251    /**
1252     * 返回当前日期和时间。
1253     */
1254    public static QueryColumn localTimestamp() {
1255        return new FunctionQueryColumn(LOCALTIMESTAMP);
1256    }
1257
1258    /**
1259     * 以 UNIX 时间戳的形式返回当前时间。
1260     */
1261    public static QueryColumn unixTimestamp() {
1262        return new FunctionQueryColumn(UNIX_TIMESTAMP);
1263    }
1264
1265    /**
1266     * 将时间 d 以 UNIX 时间戳的形式返回。
1267     */
1268    public static QueryColumn unixTimestamp(String columnD) {
1269        return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD);
1270    }
1271
1272    /**
1273     * 将时间 d 以 UNIX 时间戳的形式返回。
1274     */
1275    public static QueryColumn unixTimestamp(QueryColumn columnD) {
1276        return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD);
1277    }
1278
1279    /**
1280     * 将时间 d 以 UNIX 时间戳的形式返回。
1281     */
1282    public static <T> QueryColumn unixTimestamp(LambdaGetter<T> columnD) {
1283        return new FunctionQueryColumn(UNIX_TIMESTAMP, LambdaUtil.getQueryColumn(columnD));
1284    }
1285
1286    /**
1287     * 把 UNIX 时间戳的时间转换为普通格式的时间。
1288     */
1289    public static QueryColumn fromUnixTime(String columnD) {
1290        return new FunctionQueryColumn(FROM_UNIXTIME, columnD);
1291    }
1292
1293    /**
1294     * 把 UNIX 时间戳的时间转换为普通格式的时间。
1295     */
1296    public static QueryColumn fromUnixTime(QueryColumn columnD) {
1297        return new FunctionQueryColumn(FROM_UNIXTIME, columnD);
1298    }
1299
1300    /**
1301     * 把 UNIX 时间戳的时间转换为普通格式的时间。
1302     */
1303    public static <T> QueryColumn fromUnixTime(LambdaGetter<T> columnD) {
1304        return new FunctionQueryColumn(FROM_UNIXTIME, LambdaUtil.getQueryColumn(columnD));
1305    }
1306
1307    /**
1308     * 返回 UTC(国际协调时间)日期。
1309     */
1310    public static QueryColumn utcDate() {
1311        return new FunctionQueryColumn(UTC_DATE);
1312    }
1313
1314    /**
1315     * 返回 UTC 时间。
1316     */
1317    public static QueryColumn utcTime() {
1318        return new FunctionQueryColumn(UTC_TIME);
1319    }
1320
1321    /**
1322     * 返回日期 d 中的月份值,范围是 1~12。
1323     */
1324    public static QueryColumn month(String columnD) {
1325        return new FunctionQueryColumn(MONTH, columnD);
1326    }
1327
1328    /**
1329     * 返回日期 d 中的月份值,范围是 1~12。
1330     */
1331    public static QueryColumn month(QueryColumn columnD) {
1332        return new FunctionQueryColumn(MONTH, columnD);
1333    }
1334
1335    /**
1336     * 返回日期 d 中的月份值,范围是 1~12。
1337     */
1338    public static <T> QueryColumn month(LambdaGetter<T> columnD) {
1339        return new FunctionQueryColumn(MONTH, LambdaUtil.getQueryColumn(columnD));
1340    }
1341
1342    /**
1343     * 返回日期 d 中的月份名称,如 january。
1344     */
1345    public static QueryColumn monthName(String columnD) {
1346        return new FunctionQueryColumn(MONTHNAME, columnD);
1347    }
1348
1349    /**
1350     * 返回日期 d 中的月份名称,如 january。
1351     */
1352    public static QueryColumn monthName(QueryColumn columnD) {
1353        return new FunctionQueryColumn(MONTHNAME, columnD);
1354    }
1355
1356    /**
1357     * 返回日期 d 中的月份名称,如 january。
1358     */
1359    public static <T> QueryColumn monthName(LambdaGetter<T> columnD) {
1360        return new FunctionQueryColumn(MONTHNAME, LambdaUtil.getQueryColumn(columnD));
1361    }
1362
1363    /**
1364     * 返回日期 d 是星期几,如 Monday。
1365     */
1366    public static QueryColumn dayName(String columnD) {
1367        return new FunctionQueryColumn(DAYNAME, columnD);
1368    }
1369
1370    /**
1371     * 返回日期 d 是星期几,如 Monday。
1372     */
1373    public static QueryColumn dayName(QueryColumn columnD) {
1374        return new FunctionQueryColumn(DAYNAME, columnD);
1375    }
1376
1377    /**
1378     * 返回日期 d 是星期几,如 Monday。
1379     */
1380    public static <T> QueryColumn dayName(LambdaGetter<T> columnD) {
1381        return new FunctionQueryColumn(DAYNAME, LambdaUtil.getQueryColumn(columnD));
1382    }
1383
1384    /**
1385     * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。
1386     */
1387    public static QueryColumn dayOfWeek(String columnD) {
1388        return new FunctionQueryColumn(DAYOFWEEK, columnD);
1389    }
1390
1391    /**
1392     * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。
1393     */
1394    public static QueryColumn dayOfWeek(QueryColumn columnD) {
1395        return new FunctionQueryColumn(DAYOFWEEK, columnD);
1396    }
1397
1398    /**
1399     * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。
1400     */
1401    public static <T> QueryColumn dayOfWeek(LambdaGetter<T> columnD) {
1402        return new FunctionQueryColumn(DAYOFWEEK, LambdaUtil.getQueryColumn(columnD));
1403    }
1404
1405    /**
1406     * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。
1407     */
1408    public static QueryColumn weekday(String columnD) {
1409        return new FunctionQueryColumn(WEEKDAY, columnD);
1410    }
1411
1412    /**
1413     * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。
1414     */
1415    public static QueryColumn weekday(QueryColumn columnD) {
1416        return new FunctionQueryColumn(WEEKDAY, columnD);
1417    }
1418
1419    /**
1420     * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。
1421     */
1422    public static <T> QueryColumn weekday(LambdaGetter<T> columnD) {
1423        return new FunctionQueryColumn(WEEKDAY, LambdaUtil.getQueryColumn(columnD));
1424    }
1425
1426    /**
1427     * 计算日期 d 是本年的第几个星期,范围是 0-53。
1428     */
1429    public static QueryColumn week(String columnD) {
1430        return new FunctionQueryColumn(WEEK, columnD);
1431    }
1432
1433    /**
1434     * 计算日期 d 是本年的第几个星期,范围是 0-53。
1435     */
1436    public static QueryColumn week(QueryColumn columnD) {
1437        return new FunctionQueryColumn(WEEK, columnD);
1438    }
1439
1440    /**
1441     * 计算日期 d 是本年的第几个星期,范围是 0-53。
1442     */
1443    public static <T> QueryColumn week(LambdaGetter<T> columnD) {
1444        return new FunctionQueryColumn(WEEK, LambdaUtil.getQueryColumn(columnD));
1445    }
1446
1447    /**
1448     * 计算日期 d 是本年的第几个星期,范围是 1-53。
1449     */
1450    public static QueryColumn weekOfYear(String columnD) {
1451        return new FunctionQueryColumn(WEEKOFYEAR, columnD);
1452    }
1453
1454    /**
1455     * 计算日期 d 是本年的第几个星期,范围是 1-53。
1456     */
1457    public static QueryColumn weekOfYear(QueryColumn columnD) {
1458        return new FunctionQueryColumn(WEEKOFYEAR, columnD);
1459    }
1460
1461    /**
1462     * 计算日期 d 是本年的第几个星期,范围是 1-53。
1463     */
1464    public static <T> QueryColumn weekOfYear(LambdaGetter<T> columnD) {
1465        return new FunctionQueryColumn(WEEKOFYEAR, LambdaUtil.getQueryColumn(columnD));
1466    }
1467
1468    /**
1469     * 计算日期 d 是本年的第几天。
1470     */
1471    public static QueryColumn dayOfYear(String columnD) {
1472        return new FunctionQueryColumn(DAYOFYEAR, columnD);
1473    }
1474
1475    /**
1476     * 计算日期 d 是本年的第几天。
1477     */
1478    public static QueryColumn dayOfYear(QueryColumn columnD) {
1479        return new FunctionQueryColumn(DAYOFYEAR, columnD);
1480    }
1481
1482    /**
1483     * 计算日期 d 是本年的第几天。
1484     */
1485    public static <T> QueryColumn dayOfYear(LambdaGetter<T> columnD) {
1486        return new FunctionQueryColumn(DAYOFYEAR, LambdaUtil.getQueryColumn(columnD));
1487    }
1488
1489    /**
1490     * 计算日期 d 是本月的第几天。
1491     */
1492    public static QueryColumn dayOfMonth(String columnD) {
1493        return new FunctionQueryColumn(DAYOFMONTH, columnD);
1494    }
1495
1496    /**
1497     * 计算日期 d 是本月的第几天。
1498     */
1499    public static QueryColumn dayOfMonth(QueryColumn columnD) {
1500        return new FunctionQueryColumn(DAYOFMONTH, columnD);
1501    }
1502
1503    /**
1504     * 计算日期 d 是本月的第几天。
1505     */
1506    public static <T> QueryColumn dayOfMonth(LambdaGetter<T> columnD) {
1507        return new FunctionQueryColumn(DAYOFMONTH, LambdaUtil.getQueryColumn(columnD));
1508    }
1509
1510    /**
1511     * 返回日期 d 中的年份值。
1512     */
1513    public static QueryColumn year(String columnD) {
1514        return new FunctionQueryColumn(YEAR, columnD);
1515    }
1516
1517    /**
1518     * 返回日期 d 中的年份值。
1519     */
1520    public static QueryColumn year(QueryColumn columnD) {
1521        return new FunctionQueryColumn(YEAR, columnD);
1522    }
1523
1524    /**
1525     * 返回日期 d 中的年份值。
1526     */
1527    public static <T> QueryColumn year(LambdaGetter<T> columnD) {
1528        return new FunctionQueryColumn(YEAR, LambdaUtil.getQueryColumn(columnD));
1529    }
1530
1531    /**
1532     * 返回日期 d 中的天数值。
1533     */
1534    public static FunctionQueryColumn day(String columnD) {
1535        return new FunctionQueryColumn(DAY, columnD);
1536    }
1537
1538    /**
1539     * 返回日期 d 中的天数值。
1540     */
1541    public static FunctionQueryColumn day(QueryColumn columnD) {
1542        return new FunctionQueryColumn(DAY, columnD);
1543    }
1544
1545    /**
1546     * 返回日期 d 中的天数值。
1547     */
1548    public static <T> FunctionQueryColumn day(LambdaGetter<T> columnD) {
1549        return new FunctionQueryColumn(DAY, LambdaUtil.getQueryColumn(columnD));
1550    }
1551
1552    /**
1553     * 返回日期 d 是第几季度,范围 1-4。
1554     */
1555    public static QueryColumn quarter(String columnD) {
1556        return new FunctionQueryColumn(QUARTER, columnD);
1557    }
1558
1559    /**
1560     * 返回日期 d 是第几季度,范围 1-4。
1561     */
1562    public static QueryColumn quarter(QueryColumn columnD) {
1563        return new FunctionQueryColumn(QUARTER, columnD);
1564    }
1565
1566    /**
1567     * 返回日期 d 是第几季度,范围 1-4。
1568     */
1569    public static <T> QueryColumn quarter(LambdaGetter<T> columnD) {
1570        return new FunctionQueryColumn(QUARTER, LambdaUtil.getQueryColumn(columnD));
1571    }
1572
1573    /**
1574     * 返回时间 t 中的小时值。
1575     */
1576    public static QueryColumn hour(String columnT) {
1577        return new FunctionQueryColumn(HOUR, columnT);
1578    }
1579
1580    /**
1581     * 返回时间 t 中的小时值。
1582     */
1583    public static QueryColumn hour(QueryColumn columnT) {
1584        return new FunctionQueryColumn(HOUR, columnT);
1585    }
1586
1587    /**
1588     * 返回时间 t 中的小时值。
1589     */
1590    public static <T> QueryColumn hour(LambdaGetter<T> columnT) {
1591        return new FunctionQueryColumn(HOUR, LambdaUtil.getQueryColumn(columnT));
1592    }
1593
1594    /**
1595     * 返回时间 t 中的分钟值。
1596     */
1597    public static QueryColumn minute(String columnT) {
1598        return new FunctionQueryColumn(MINUTE, columnT);
1599    }
1600
1601    /**
1602     * 返回时间 t 中的分钟值。
1603     */
1604    public static QueryColumn minute(QueryColumn columnT) {
1605        return new FunctionQueryColumn(MINUTE, columnT);
1606    }
1607
1608    /**
1609     * 返回时间 t 中的分钟值。
1610     */
1611    public static <T> QueryColumn minute(LambdaGetter<T> columnT) {
1612        return new FunctionQueryColumn(MINUTE, LambdaUtil.getQueryColumn(columnT));
1613    }
1614
1615    /**
1616     * 返回时间 t 中的秒钟值。
1617     */
1618    public static QueryColumn second(String columnT) {
1619        return new FunctionQueryColumn(SECOND, columnT);
1620    }
1621
1622    /**
1623     * 返回时间 t 中的秒钟值。
1624     */
1625    public static QueryColumn second(QueryColumn columnT) {
1626        return new FunctionQueryColumn(SECOND, columnT);
1627    }
1628
1629    /**
1630     * 返回时间 t 中的秒钟值。
1631     */
1632    public static <T> QueryColumn second(LambdaGetter<T> columnT) {
1633        return new FunctionQueryColumn(SECOND, LambdaUtil.getQueryColumn(columnT));
1634    }
1635
1636    /**
1637     * 将时间 t 转换为秒。
1638     */
1639    public static QueryColumn timeToSec(String columnT) {
1640        return new FunctionQueryColumn(TIME_TO_SEC, columnT);
1641    }
1642
1643    /**
1644     * 将时间 t 转换为秒。
1645     */
1646    public static QueryColumn timeToSec(QueryColumn columnT) {
1647        return new FunctionQueryColumn(TIME_TO_SEC, columnT);
1648    }
1649
1650    /**
1651     * 将时间 t 转换为秒。
1652     */
1653    public static <T> QueryColumn timeToSec(LambdaGetter<T> columnT) {
1654        return new FunctionQueryColumn(TIME_TO_SEC, LambdaUtil.getQueryColumn(columnT));
1655    }
1656
1657    /**
1658     * 将以秒为单位的时间 s 转换为时分秒的格式。
1659     */
1660    public static QueryColumn secToTime(String columnS) {
1661        return new FunctionQueryColumn(SEC_TO_TIME, columnS);
1662    }
1663
1664    /**
1665     * 将以秒为单位的时间 s 转换为时分秒的格式。
1666     */
1667    public static QueryColumn secToTime(QueryColumn columnS) {
1668        return new FunctionQueryColumn(SEC_TO_TIME, columnS);
1669    }
1670
1671    /**
1672     * 将以秒为单位的时间 s 转换为时分秒的格式。
1673     */
1674    public static <T> QueryColumn secToTime(LambdaGetter<T> columnS) {
1675        return new FunctionQueryColumn(SEC_TO_TIME, LambdaUtil.getQueryColumn(columnS));
1676    }
1677
1678    /**
1679     * 计算日期 d 到 0000 年 1 月 1 日的天数。
1680     */
1681    public static QueryColumn toDays(String columnD) {
1682        return new FunctionQueryColumn(TO_DAYS, columnD);
1683    }
1684
1685    /**
1686     * 计算日期 d 到 0000 年 1 月 1 日的天数。
1687     */
1688    public static QueryColumn toDays(QueryColumn columnD) {
1689        return new FunctionQueryColumn(TO_DAYS, columnD);
1690    }
1691
1692    /**
1693     * 计算日期 d 到 0000 年 1 月 1 日的天数。
1694     */
1695    public static <T> QueryColumn toDays(LambdaGetter<T> columnD) {
1696        return new FunctionQueryColumn(TO_DAYS, LambdaUtil.getQueryColumn(columnD));
1697    }
1698
1699    /**
1700     * 计算从 0000 年 1 月 1 日开始 n 天后的日期。
1701     */
1702    public static QueryColumn fromDays(String columnD) {
1703        return new FunctionQueryColumn(FROM_DAYS, columnD);
1704    }
1705
1706    /**
1707     * 计算从 0000 年 1 月 1 日开始 n 天后的日期。
1708     */
1709    public static QueryColumn fromDays(QueryColumn columnD) {
1710        return new FunctionQueryColumn(FROM_DAYS, columnD);
1711    }
1712
1713    /**
1714     * 计算从 0000 年 1 月 1 日开始 n 天后的日期。
1715     */
1716    public static <T> QueryColumn fromDays(LambdaGetter<T> columnD) {
1717        return new FunctionQueryColumn(FROM_DAYS, LambdaUtil.getQueryColumn(columnD));
1718    }
1719
1720    /**
1721     * 计算日期 d1 到 d2 之间相隔的天数。
1722     */
1723    public static QueryColumn dateDiff(String columnD1, String columnD2) {
1724        return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2);
1725    }
1726
1727    /**
1728     * 计算日期 d1 到 d2 之间相隔的天数。
1729     */
1730    public static QueryColumn dateDiff(QueryColumn columnD1, QueryColumn columnD2) {
1731        return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2);
1732    }
1733
1734    /**
1735     * 计算日期 d1 到 d2 之间相隔的天数。
1736     */
1737    public static <D1, D2> QueryColumn dateDiff(LambdaGetter<D1> columnD1, LambdaGetter<D2> columnD2) {
1738        return new FunctionQueryColumn(DATEDIFF, LambdaUtil.getQueryColumn(columnD1), LambdaUtil.getQueryColumn(columnD2));
1739    }
1740
1741    /**
1742     * 计算开始日期 d 加上 n 天的日期。
1743     */
1744    public static QueryColumn addDate(String columnD, String columnN) {
1745        return new FunctionQueryColumn(ADDDATE, columnD, columnN);
1746    }
1747
1748    /**
1749     * 计算开始日期 d 加上 n 天的日期。
1750     */
1751    public static QueryColumn addDate(QueryColumn columnD, QueryColumn columnN) {
1752        return new FunctionQueryColumn(ADDDATE, columnD, columnN);
1753    }
1754
1755    /**
1756     * 计算开始日期 d 加上 n 天的日期。
1757     */
1758    public static <D, N> QueryColumn addDate(LambdaGetter<D> columnD, LambdaGetter<N> columnN) {
1759        return new FunctionQueryColumn(ADDDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN));
1760    }
1761
1762    /**
1763     * 计算起始日期 d 减去 n 天的日期。
1764     */
1765    public static QueryColumn subDate(String columnD, String columnN) {
1766        return new FunctionQueryColumn(SUBDATE, columnD, columnN);
1767    }
1768
1769    /**
1770     * 计算起始日期 d 减去 n 天的日期。
1771     */
1772    public static QueryColumn subDate(QueryColumn columnD, QueryColumn columnN) {
1773        return new FunctionQueryColumn(SUBDATE, columnD, columnN);
1774    }
1775
1776    /**
1777     * 计算起始日期 d 减去 n 天的日期。
1778     */
1779    public static <D, N> QueryColumn subDate(LambdaGetter<D> columnD, LambdaGetter<N> columnN) {
1780        return new FunctionQueryColumn(SUBDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN));
1781    }
1782
1783    /**
1784     * 计算起始时间 t 加上 n 秒的时间。
1785     */
1786    public static QueryColumn addTime(String columnT, String columnN) {
1787        return new FunctionQueryColumn(ADDTIME, columnT, columnN);
1788    }
1789
1790    /**
1791     * 计算起始时间 t 加上 n 秒的时间。
1792     */
1793    public static QueryColumn addTime(QueryColumn columnT, QueryColumn columnN) {
1794        return new FunctionQueryColumn(ADDTIME, columnT, columnN);
1795    }
1796
1797    /**
1798     * 计算起始时间 t 加上 n 秒的时间。
1799     */
1800    public static <T, N> QueryColumn addTime(LambdaGetter<T> columnT, LambdaGetter<N> columnN) {
1801        return new FunctionQueryColumn(ADDTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN));
1802    }
1803
1804    /**
1805     * 计算起始时间 t 减去 n 秒的时间。
1806     */
1807    public static QueryColumn subTime(String columnT, String columnN) {
1808        return new FunctionQueryColumn(SUBTIME, columnT, columnN);
1809    }
1810
1811    /**
1812     * 计算起始时间 t 减去 n 秒的时间。
1813     */
1814    public static QueryColumn subTime(QueryColumn columnT, QueryColumn columnN) {
1815        return new FunctionQueryColumn(SUBTIME, columnT, columnN);
1816    }
1817
1818    /**
1819     * 计算起始时间 t 减去 n 秒的时间。
1820     */
1821    public static <T, N> QueryColumn subTime(LambdaGetter<T> columnT, LambdaGetter<N> columnN) {
1822        return new FunctionQueryColumn(SUBTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN));
1823    }
1824
1825    /**
1826     * 按照表达式 f 的要求显示日期 d。
1827     */
1828    public static QueryColumn dateFormat(String columnD, String format) {
1829        return new FunctionQueryColumn(DATE_FORMAT, string(columnD), string(format));
1830    }
1831
1832    /**
1833     * 按照表达式 f 的要求显示日期 d。
1834     */
1835    public static QueryColumn dateFormat(QueryColumn columnD, String format) {
1836        return new FunctionQueryColumn(DATE_FORMAT, columnD, string(format));
1837    }
1838
1839    /**
1840     * 按照表达式 f 的要求显示日期 d。
1841     */
1842    public static <D, F> QueryColumn dateFormat(LambdaGetter<D> columnD, String format) {
1843        return new FunctionQueryColumn(DATE_FORMAT, LambdaUtil.getQueryColumn(columnD), string(format));
1844    }
1845
1846    /**
1847     * 按照表达式 f 的要求显示时间 t。
1848     */
1849    public static QueryColumn timeFormat(String columnT, String columnF) {
1850        return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF);
1851    }
1852
1853    /**
1854     * 按照表达式 f 的要求显示时间 t。
1855     */
1856    public static QueryColumn timeFormat(QueryColumn columnT, QueryColumn columnF) {
1857        return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF);
1858    }
1859
1860    /**
1861     * 按照表达式 f 的要求显示时间 t。
1862     */
1863    public static <T, F> QueryColumn timeFormat(LambdaGetter<T> columnT, LambdaGetter<F> columnF) {
1864        return new FunctionQueryColumn(TIME_FORMAT, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnF));
1865    }
1866
1867    /**
1868     * 根据字符串 s 获取 type 类型数据的显示格式。
1869     */
1870    public static QueryColumn getFormat(String columnType, String columnS) {
1871        return new FunctionQueryColumn(GET_FORMAT, columnType, columnS);
1872    }
1873
1874    /**
1875     * 根据字符串 s 获取 type 类型数据的显示格式。
1876     */
1877    public static QueryColumn getFormat(QueryColumn columnType, QueryColumn columnS) {
1878        return new FunctionQueryColumn(GET_FORMAT, columnType, columnS);
1879    }
1880
1881    /**
1882     * 根据字符串 s 获取 type 类型数据的显示格式。
1883     */
1884    public static <T, S> QueryColumn getFormat(LambdaGetter<T> columnType, LambdaGetter<S> columnS) {
1885        return new FunctionQueryColumn(GET_FORMAT, LambdaUtil.getQueryColumn(columnType), LambdaUtil.getQueryColumn(columnS));
1886    }
1887
1888    // === 系统信息函数 ===
1889
1890    /**
1891     * 返回数据库的版本号。
1892     */
1893    public static QueryColumn version() {
1894        return new FunctionQueryColumn(VERSION);
1895    }
1896
1897    /**
1898     * 返回服务器的连接数。
1899     */
1900    public static QueryColumn connectionId() {
1901        return new FunctionQueryColumn(CONNECTION_ID);
1902    }
1903
1904    /**
1905     * 返回当前数据库名。
1906     */
1907    public static QueryColumn database() {
1908        return new FunctionQueryColumn(DATABASE);
1909    }
1910
1911    /**
1912     * 返回当前数据库 schema。
1913     */
1914    public static QueryColumn schema() {
1915        return new FunctionQueryColumn(SCHEMA);
1916    }
1917
1918    /**
1919     * 返回当前用户的名称。
1920     */
1921    public static QueryColumn user() {
1922        return new FunctionQueryColumn(USER);
1923    }
1924
1925    /**
1926     * 返回字符串 str 的字符集。
1927     */
1928    public static QueryColumn charset(String columnStr) {
1929        return new FunctionQueryColumn(CHARSET, columnStr);
1930    }
1931
1932    /**
1933     * 返回字符串 str 的字符集。
1934     */
1935    public static QueryColumn charset(QueryColumn columnStr) {
1936        return new FunctionQueryColumn(CHARSET, columnStr);
1937    }
1938
1939    /**
1940     * 返回字符串 str 的字符集。
1941     */
1942    public static <T> QueryColumn charset(LambdaGetter<T> columnStr) {
1943        return new FunctionQueryColumn(CHARSET, LambdaUtil.getQueryColumn(columnStr));
1944    }
1945
1946    /**
1947     * 返回字符串 str 的字符排列方式。
1948     */
1949    public static QueryColumn collation(String columnStr) {
1950        return new FunctionQueryColumn(COLLATION, columnStr);
1951    }
1952
1953    /**
1954     * 返回字符串 str 的字符排列方式。
1955     */
1956    public static QueryColumn collation(QueryColumn columnStr) {
1957        return new FunctionQueryColumn(COLLATION, columnStr);
1958    }
1959
1960    /**
1961     * 返回字符串 str 的字符排列方式。
1962     */
1963    public static <T> QueryColumn collation(LambdaGetter<T> columnStr) {
1964        return new FunctionQueryColumn(COLLATION, LambdaUtil.getQueryColumn(columnStr));
1965    }
1966
1967    /**
1968     * 返回最后生成的 auto_increment 值。
1969     */
1970    public static QueryColumn lastInsertId() {
1971        return new FunctionQueryColumn(LAST_INSERT_ID);
1972    }
1973
1974    // === 加密函数 ===
1975
1976    /**
1977     * 对字符串 str 进行加密。
1978     */
1979    public static QueryColumn password(String columnStr) {
1980        return new FunctionQueryColumn(PASSWORD, columnStr);
1981    }
1982
1983    /**
1984     * 对字符串 str 进行加密。
1985     */
1986    public static QueryColumn password(QueryColumn columnStr) {
1987        return new FunctionQueryColumn(PASSWORD, columnStr);
1988    }
1989
1990    /**
1991     * 对字符串 str 进行加密。
1992     */
1993    public static <T> QueryColumn password(LambdaGetter<T> columnStr) {
1994        return new FunctionQueryColumn(PASSWORD, LambdaUtil.getQueryColumn(columnStr));
1995    }
1996
1997    /**
1998     * 对字符串 str 进行加密。
1999     */
2000    public static QueryColumn md5(String columnStr) {
2001        return new FunctionQueryColumn(MD5, columnStr);
2002    }
2003
2004    /**
2005     * 对字符串 str 进行加密。
2006     */
2007    public static QueryColumn md5(QueryColumn columnStr) {
2008        return new FunctionQueryColumn(MD5, columnStr);
2009    }
2010
2011    /**
2012     * 对字符串 str 进行加密。
2013     */
2014    public static <T> QueryColumn md5(LambdaGetter<T> columnStr) {
2015        return new FunctionQueryColumn(MD5, LambdaUtil.getQueryColumn(columnStr));
2016    }
2017
2018    /**
2019     * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。
2020     */
2021    public static QueryColumn encode(String columnStr, String columnPswdStr) {
2022        return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr);
2023    }
2024
2025    /**
2026     * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。
2027     */
2028    public static QueryColumn encode(QueryColumn columnStr, QueryColumn columnPswdStr) {
2029        return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr);
2030    }
2031
2032    /**
2033     * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。
2034     */
2035    public static <S, P> QueryColumn encode(LambdaGetter<S> columnStr, LambdaGetter<P> columnPswdStr) {
2036        return new FunctionQueryColumn(ENCODE, LambdaUtil.getQueryColumn(columnStr), LambdaUtil.getQueryColumn(columnPswdStr));
2037    }
2038
2039    /**
2040     * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。
2041     */
2042    public static QueryColumn decode(String columnCryptStr, String columnPswdStr) {
2043        return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr);
2044    }
2045
2046    /**
2047     * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。
2048     */
2049    public static QueryColumn decode(QueryColumn columnCryptStr, QueryColumn columnPswdStr) {
2050        return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr);
2051    }
2052
2053    /**
2054     * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。
2055     */
2056    public static <C, P> QueryColumn decode(LambdaGetter<C> columnCryptStr, LambdaGetter<P> columnPswdStr) {
2057        return new FunctionQueryColumn(DECODE, LambdaUtil.getQueryColumn(columnCryptStr), LambdaUtil.getQueryColumn(columnPswdStr));
2058    }
2059
2060    // === 其他函数 ===
2061
2062    /**
2063     * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。
2064     */
2065    public static QueryColumn format(String columnX, String columnN) {
2066        return new FunctionQueryColumn(FORMAT, columnX, columnN);
2067    }
2068
2069    /**
2070     * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。
2071     */
2072    public static QueryColumn format(QueryColumn columnX, QueryColumn columnN) {
2073        return new FunctionQueryColumn(FORMAT, columnX, columnN);
2074    }
2075
2076    /**
2077     * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。
2078     */
2079    public static <X, N> QueryColumn format(LambdaGetter<X> columnX, LambdaGetter<N> columnN) {
2080        return new FunctionQueryColumn(FORMAT, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnN));
2081    }
2082
2083    /**
2084     * 返回字符串 s 的第一个字符的 ASSCII 码。
2085     */
2086    public static QueryColumn ascii(String columnS) {
2087        return new FunctionQueryColumn(ASCII, columnS);
2088    }
2089
2090    /**
2091     * 返回字符串 s 的第一个字符的 ASSCII 码。
2092     */
2093    public static QueryColumn ascii(QueryColumn columnS) {
2094        return new FunctionQueryColumn(ASCII, columnS);
2095    }
2096
2097    /**
2098     * 返回字符串 s 的第一个字符的 ASSCII 码。
2099     */
2100    public static <T> QueryColumn ascii(LambdaGetter<T> columnS) {
2101        return new FunctionQueryColumn(ASCII, LambdaUtil.getQueryColumn(columnS));
2102    }
2103
2104    /**
2105     * 返回 x 的二进制编码。
2106     */
2107    public static QueryColumn bin(String columnX) {
2108        return new FunctionQueryColumn(BIN, columnX);
2109    }
2110
2111    /**
2112     * 返回 x 的二进制编码。
2113     */
2114    public static QueryColumn bin(QueryColumn columnX) {
2115        return new FunctionQueryColumn(BIN, columnX);
2116    }
2117
2118    /**
2119     * 返回 x 的二进制编码。
2120     */
2121    public static <T> QueryColumn bin(LambdaGetter<T> columnX) {
2122        return new FunctionQueryColumn(BIN, LambdaUtil.getQueryColumn(columnX));
2123    }
2124
2125    /**
2126     * 返回 x 的十六进制编码。
2127     */
2128    public static QueryColumn hex(String columnX) {
2129        return new FunctionQueryColumn(HEX, columnX);
2130    }
2131
2132    /**
2133     * 返回 x 的十六进制编码。
2134     */
2135    public static QueryColumn hex(QueryColumn columnX) {
2136        return new FunctionQueryColumn(HEX, columnX);
2137    }
2138
2139    /**
2140     * 返回 x 的十六进制编码。
2141     */
2142    public static <T> QueryColumn hex(LambdaGetter<T> columnX) {
2143        return new FunctionQueryColumn(HEX, LambdaUtil.getQueryColumn(columnX));
2144    }
2145
2146    /**
2147     * 返回 x 的八进制编码。
2148     */
2149    public static QueryColumn oct(String columnX) {
2150        return new FunctionQueryColumn(OCT, columnX);
2151    }
2152
2153    /**
2154     * 返回 x 的八进制编码。
2155     */
2156    public static QueryColumn oct(QueryColumn columnX) {
2157        return new FunctionQueryColumn(OCT, columnX);
2158    }
2159
2160    /**
2161     * 返回 x 的八进制编码。
2162     */
2163    public static <T> QueryColumn oct(LambdaGetter<T> columnX) {
2164        return new FunctionQueryColumn(OCT, LambdaUtil.getQueryColumn(columnX));
2165    }
2166
2167    /**
2168     * 将 x 从 f1 进制数变成 f2 进制数。
2169     */
2170    public static QueryColumn conv(String columnX, String columnF1, String columnF2) {
2171        return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2);
2172    }
2173
2174    /**
2175     * 将 x 从 f1 进制数变成 f2 进制数。
2176     */
2177    public static QueryColumn conv(QueryColumn columnX, QueryColumn columnF1, QueryColumn columnF2) {
2178        return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2);
2179    }
2180
2181    /**
2182     * 将 x 从 f1 进制数变成 f2 进制数。
2183     */
2184    public static <X, F1, F2> QueryColumn conv(LambdaGetter<X> columnX, LambdaGetter<F1> columnF1, LambdaGetter<F2> columnF2) {
2185        return new FunctionQueryColumn(CONV, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnF1), LambdaUtil.getQueryColumn(columnF2));
2186    }
2187
2188    /**
2189     * 将 IP 地址转换为数字表示,IP 值需要加上引号。
2190     */
2191    public static QueryColumn inetAton(String columnIP) {
2192        return new FunctionQueryColumn(INET_ATON, columnIP);
2193    }
2194
2195    /**
2196     * 将 IP 地址转换为数字表示,IP 值需要加上引号。
2197     */
2198    public static QueryColumn inetAton(QueryColumn columnIP) {
2199        return new FunctionQueryColumn(INET_ATON, columnIP);
2200    }
2201
2202    /**
2203     * 将 IP 地址转换为数字表示,IP 值需要加上引号。
2204     */
2205    public static <T> QueryColumn inetAton(LambdaGetter<T> columnIP) {
2206        return new FunctionQueryColumn(INET_ATON, LambdaUtil.getQueryColumn(columnIP));
2207    }
2208
2209    /**
2210     * 可以将数字 n 转换成 IP 的形式。
2211     */
2212    public static QueryColumn inetNtoa(String columnN) {
2213        return new FunctionQueryColumn(INET_NTOA, columnN);
2214    }
2215
2216    /**
2217     * 可以将数字 n 转换成 IP 的形式。
2218     */
2219    public static QueryColumn inetNtoa(QueryColumn columnN) {
2220        return new FunctionQueryColumn(INET_NTOA, columnN);
2221    }
2222
2223    /**
2224     * 可以将数字 n 转换成 IP 的形式。
2225     */
2226    public static <T> QueryColumn inetNtoa(LambdaGetter<T> columnN) {
2227        return new FunctionQueryColumn(INET_NTOA, LambdaUtil.getQueryColumn(columnN));
2228    }
2229
2230    // === 聚合函数 ===
2231
2232    /**
2233     * 返回指定列的最大值。
2234     */
2235    public static FunctionQueryColumn max(String column) {
2236        return new FunctionQueryColumn(MAX, column);
2237    }
2238
2239    /**
2240     * 返回指定列的最大值。
2241     */
2242    public static FunctionQueryColumn max(QueryColumn column) {
2243        return new FunctionQueryColumn(MAX, column);
2244    }
2245
2246    /**
2247     * 返回指定列的最大值。
2248     */
2249    public static <T> FunctionQueryColumn max(LambdaGetter<T> column) {
2250        return new FunctionQueryColumn(MAX, LambdaUtil.getQueryColumn(column));
2251    }
2252
2253    /**
2254     * 返回指定列的最小值。
2255     */
2256    public static FunctionQueryColumn min(String column) {
2257        return new FunctionQueryColumn(MIN, column);
2258    }
2259
2260    /**
2261     * 返回指定列的最小值。
2262     */
2263    public static FunctionQueryColumn min(QueryColumn column) {
2264        return new FunctionQueryColumn(MIN, column);
2265    }
2266
2267    /**
2268     * 返回指定列的最小值。
2269     */
2270    public static <T> FunctionQueryColumn min(LambdaGetter<T> column) {
2271        return new FunctionQueryColumn(MIN, LambdaUtil.getQueryColumn(column));
2272    }
2273
2274    /**
2275     * 返回指定列的平均值。
2276     */
2277    public static FunctionQueryColumn avg(String column) {
2278        return new FunctionQueryColumn(AVG, column);
2279    }
2280
2281    /**
2282     * 返回指定列的平均值。
2283     */
2284    public static FunctionQueryColumn avg(QueryColumn column) {
2285        return new FunctionQueryColumn(AVG, column);
2286    }
2287
2288    /**
2289     * 返回指定列的平均值。
2290     */
2291    public static <T> FunctionQueryColumn avg(LambdaGetter<T> column) {
2292        return new FunctionQueryColumn(AVG, LambdaUtil.getQueryColumn(column));
2293    }
2294
2295    /**
2296     * 返回指定字段值的和。
2297     */
2298    public static FunctionQueryColumn sum(String column) {
2299        return new FunctionQueryColumn(SUM, column);
2300    }
2301
2302    /**
2303     * 返回指定字段值的和。
2304     */
2305    public static FunctionQueryColumn sum(QueryColumn column) {
2306        return new FunctionQueryColumn(SUM, column);
2307    }
2308
2309    /**
2310     * 返回指定字段值的和。
2311     */
2312    public static <T> FunctionQueryColumn sum(LambdaGetter<T> column) {
2313        return new FunctionQueryColumn(SUM, LambdaUtil.getQueryColumn(column));
2314    }
2315
2316    // === COUNT ===
2317
2318    /**
2319     * 返回指定列的总行数。
2320     */
2321    public static FunctionQueryColumn count() {
2322        return new FunctionQueryColumn(COUNT, new RawQueryColumn("*"));
2323    }
2324
2325    /**
2326     * 返回指定列的总行数。
2327     */
2328    public static FunctionQueryColumn count(String column) {
2329        return new FunctionQueryColumn(COUNT, column);
2330    }
2331
2332    /**
2333     * 返回指定列的总行数。
2334     */
2335    public static FunctionQueryColumn count(QueryColumn column) {
2336        return new FunctionQueryColumn(COUNT, column);
2337    }
2338
2339    /**
2340     * 返回指定列的总行数。
2341     */
2342    public static <T> FunctionQueryColumn count(LambdaGetter<T> column) {
2343        return new FunctionQueryColumn(COUNT, LambdaUtil.getQueryColumn(column));
2344    }
2345
2346
2347    // === DISTINCT ===
2348
2349    /**
2350     * 对指定列进行去重。
2351     */
2352    public static DistinctQueryColumn distinct(QueryColumn... columns) {
2353        return new DistinctQueryColumn(columns);
2354    }
2355
2356    @SafeVarargs
2357    public static <T> DistinctQueryColumn distinct(LambdaGetter<T>... columns) {
2358        return new DistinctQueryColumn(Arrays.stream(columns)
2359            .map(LambdaUtil::getQueryColumn).toArray(QueryColumn[]::new));
2360    }
2361
2362    // === CASE THEN ELSE ===
2363
2364    /**
2365     * 构建 case then when 语句。
2366     */
2367    public static CaseQueryColumn.Builder case_() {
2368        return new CaseQueryColumn.Builder();
2369    }
2370
2371    /**
2372     * 构建 case then when 语句。
2373     */
2374    public static CaseSearchQueryColumn.Builder case_(QueryColumn column) {
2375        return new CaseSearchQueryColumn.Builder(column);
2376    }
2377
2378    // === CONVERT ===
2379
2380    /**
2381     * 将所给类型类型转换为另一种类型。
2382     */
2383    public static StringFunctionQueryColumn convert(String... params) {
2384        return new StringFunctionQueryColumn(CONVERT, params);
2385    }
2386
2387    // === 构建 column 列 ===
2388
2389    /**
2390     * 构建 TRUE 常量。
2391     */
2392    public static QueryColumn true_() {
2393        return new RawQueryColumn("TRUE");
2394    }
2395
2396    /**
2397     * 构建 FALSE 常量。
2398     */
2399    public static QueryColumn false_() {
2400        return new RawQueryColumn("FALSE");
2401    }
2402
2403    /**
2404     * 构建 NULL 常量。
2405     */
2406    public static QueryColumn null_() {
2407        return new RawQueryColumn("NULL");
2408    }
2409
2410    /**
2411     * 构建数字常量。
2412     */
2413    public static QueryColumn number(Number n) {
2414        return new RawQueryColumn(n);
2415    }
2416
2417    /**
2418     * 构建数字常量。
2419     */
2420    public static QueryColumn string(String s) {
2421        return new RawQueryColumn("'" + s + "'");
2422    }
2423
2424    /**
2425     * 构建相反数。
2426     */
2427    public static QueryColumn negative(QueryColumn queryColumn) {
2428        return new NegativeQueryColumn(queryColumn);
2429    }
2430
2431    /**
2432     * 构建自定义列。
2433     */
2434    public static QueryColumn column(String column, Object... params) {
2435        return new RawQueryColumn(column, params);
2436    }
2437
2438    /**
2439     * 构建自定义列。
2440     */
2441    public static QueryColumn column(String table, String column) {
2442        return new QueryColumn(table, column);
2443    }
2444
2445    /**
2446     * 构建自定义列。
2447     */
2448    public static QueryColumn column(String schema, String table, String column) {
2449        return new QueryColumn(schema, table, column);
2450    }
2451
2452    /**
2453     * 构建自定义列。
2454     */
2455    public static <T> QueryColumn column(LambdaGetter<T> column) {
2456        return LambdaUtil.getQueryColumn(column);
2457    }
2458
2459    /**
2460     * 构建自定义列。
2461     */
2462    public static QueryColumn column(QueryWrapper queryWrapper) {
2463        return new SelectQueryColumn(queryWrapper);
2464    }
2465
2466    /**
2467     * 构建所有列。
2468     */
2469    public static QueryColumn allColumns() {
2470        return column("*");
2471    }
2472
2473    /**
2474     * 构建所有列。
2475     */
2476    public static Iterable<QueryColumn> allColumns(Class<?>... classes) {
2477        List<QueryColumn> queryColumns = new ArrayList<>(classes.length);
2478        for (Class<?> aClass : classes) {
2479            TableInfo tableInfo = TableInfoFactory.ofEntityClass(aClass);
2480            QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName());
2481            queryColumns.add(new QueryColumn(queryTable, "*"));
2482        }
2483        return queryColumns;
2484    }
2485
2486    /**
2487     * 构建默认列。
2488     */
2489    public static Iterable<QueryColumn> defaultColumns(Class<?>... classes) {
2490        List<QueryColumn> queryColumns = new ArrayList<>();
2491        for (Class<?> aClass : classes) {
2492            TableInfo tableInfo = TableInfoFactory.ofEntityClass(aClass);
2493            queryColumns.addAll(tableInfo.getDefaultQueryColumn());
2494        }
2495        return queryColumns;
2496    }
2497
2498    // === IF 函数 ===
2499
2500    /**
2501     * IF 函数。
2502     */
2503    public static QueryColumn if_(QueryCondition condition, String trueColumn, String falseColumn) {
2504        return new IfFunctionQueryColumn(condition, new QueryColumn(trueColumn), new QueryColumn(falseColumn));
2505    }
2506
2507    /**
2508     * IF 函数。
2509     */
2510    public static QueryColumn if_(QueryCondition condition, QueryColumn trueColumn, QueryColumn falseColumn) {
2511        return new IfFunctionQueryColumn(condition, trueColumn, falseColumn);
2512    }
2513
2514    /**
2515     * IF 函数。
2516     */
2517    public static <T, F> QueryColumn if_(QueryCondition condition, LambdaGetter<T> trueColumn, LambdaGetter<F> falseColumn) {
2518        return new IfFunctionQueryColumn(condition, LambdaUtil.getQueryColumn(trueColumn), LambdaUtil.getQueryColumn(falseColumn));
2519    }
2520
2521    /**
2522     * IFNULL 函数。
2523     */
2524    public static QueryColumn ifNull(String nullColumn, String elseColumn) {
2525        return new FunctionQueryColumn("IFNULL", new QueryColumn(nullColumn), new QueryColumn(elseColumn));
2526    }
2527
2528    /**
2529     * IFNULL 函数。
2530     */
2531    public static QueryColumn ifNull(QueryColumn nullColumn, QueryColumn elseColumn) {
2532        return new FunctionQueryColumn("IFNULL", nullColumn, elseColumn);
2533    }
2534
2535    /**
2536     * IFNULL 函数。
2537     */
2538    public static <N, E> QueryColumn ifNull(LambdaGetter<N> nullColumn, LambdaGetter<E> elseColumn) {
2539        return new FunctionQueryColumn("IFNULL", LambdaUtil.getQueryColumn(nullColumn), LambdaUtil.getQueryColumn(elseColumn));
2540    }
2541
2542    /**
2543     * IFNULL 函数。
2544     */
2545    public static <N> QueryColumn ifNull(LambdaGetter<N> nullColumn, QueryColumn elseColumn) {
2546        return ifNull(LambdaUtil.getQueryColumn(nullColumn), elseColumn);
2547    }
2548
2549    /**
2550     * IFNULL 函数。
2551     */
2552    public static <N> QueryColumn ifNull(LambdaGetter<N> nullColumn, String elseColumn) {
2553        return ifNull(nullColumn, new QueryColumn(elseColumn));
2554    }
2555
2556
2557    // === 构建 QueryCondition 查询条件 ===
2558
2559    /**
2560     * EXIST (SELECT ...)
2561     */
2562    public static QueryCondition exists(QueryWrapper queryWrapper) {
2563        return new OperatorSelectCondition("EXISTS ", queryWrapper);
2564    }
2565
2566    /**
2567     * NOT EXIST (SELECT ...)
2568     */
2569    public static QueryCondition notExists(QueryWrapper queryWrapper) {
2570        return new OperatorSelectCondition("NOT EXISTS ", queryWrapper);
2571    }
2572
2573    /**
2574     * NOT (id = 1)
2575     */
2576    public static QueryCondition not(QueryCondition childCondition) {
2577        return new OperatorQueryCondition("NOT ", childCondition);
2578    }
2579
2580    /**
2581     * {@code NOT (column)} 或 {@code NOT column}
2582     */
2583    public static <N> QueryColumn not(LambdaGetter<N> column) {
2584        return new FunctionQueryColumn("NOT", LambdaUtil.getQueryColumn(column));
2585    }
2586
2587    /**
2588     * 空条件。
2589     */
2590    public static QueryCondition noCondition() {
2591        return QueryCondition.createEmpty();
2592    }
2593
2594    /**
2595     * 括号条件。
2596     */
2597    public static QueryCondition bracket(QueryCondition condition) {
2598        return new Brackets(condition);
2599    }
2600
2601    // === 构建 QueryWrapper 查询 ===
2602
2603    /**
2604     * SELECT queryColumns FROM table
2605     */
2606    public static QueryWrapper select(QueryColumn... queryColumns) {
2607        return newWrapper().select(queryColumns);
2608    }
2609
2610    /**
2611     * SELECT * FROM table UNION SELECT ...
2612     */
2613    public static QueryWrapper union(QueryWrapper queryWrapper) {
2614        return newWrapper().union(queryWrapper);
2615    }
2616
2617    /**
2618     * SELECT 1 as temp_one FROM table
2619     */
2620    public static QueryWrapper selectOne() {
2621        return select(column("1").as("temp_one"));
2622    }
2623
2624    /**
2625     * SELECT COUNT(*) as temp_count FROM table
2626     */
2627    public static QueryWrapper selectCount() {
2628        return select(count().as("temp_count"));
2629    }
2630
2631    /**
2632     * SELECT COUNT(1) as temp_count_one FROM table
2633     */
2634    public static QueryWrapper selectCountOne() {
2635        return select(count(new RawQueryColumn("1")).as("temp_count_one"));
2636    }
2637
2638    /**
2639     * SELECT * FROM table
2640     */
2641    private static QueryWrapper newWrapper() {
2642        return new QueryWrapper();
2643    }
2644
2645    // 构建原生 SQL 条件
2646
2647    /**
2648     * 构建原生查询条件。
2649     */
2650    public static QueryCondition raw(String raw) {
2651        return new RawQueryCondition(raw);
2652    }
2653
2654    /**
2655     * 构建原生查询条件,并附带参数。
2656     */
2657    public static QueryCondition raw(String raw, Object... params) {
2658        return new RawQueryCondition(raw, params);
2659    }
2660
2661
2662    /**
2663     * 分组值拼接
2664     */
2665    public static QueryColumn groupConcat(QueryColumn columnX) {
2666        return new FunctionQueryColumn(GROUP_CONCAT, columnX);
2667    }
2668
2669    /**
2670     * date 函数
2671     * @return
2672     */
2673    public static FunctionQueryColumn date(QueryColumn column) {
2674        return new FunctionQueryColumn("DATE", column);
2675    }
2676
2677}