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