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