From 5783acad37c226e6400798a13786780037379492 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:05:41 +0800 Subject: [PATCH 01/12] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=20APT=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processor/MybatisFlexProcessor.java | 22 ++++++++---------- .../processor/builder/ContentBuilder.java | 6 ++--- .../processor/entity/ColumnInfo.java | 23 ++++++++----------- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java index 3170d618..8cdd8b79 100644 --- a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java +++ b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java @@ -148,12 +148,8 @@ public class MybatisFlexProcessor extends AbstractProcessor { assert table != null; - // 类属性 - //修改bug https://gitee.com/mybatis-flex/mybatis-flex/issues/I7I08X - //会执行 subClass subClass - //再执行 superClass superClass - //按照顺序使用,子类有的属性,父类放不进去,也就形成了子类覆盖父类 - Collection columnInfoList = new HashSet<>(); + // 类属性 fix: https://gitee.com/mybatis-flex/mybatis-flex/issues/I7I08X + Set columnInfos = new HashSet<>(); // 默认查询的属性,非 isLarge 字段 List defaultColumns = new ArrayList<>(); @@ -161,7 +157,7 @@ public class MybatisFlexProcessor extends AbstractProcessor { do { // 获取类属性和默认查询字段 - fillColumnInfoList(columnInfoList, defaultColumns, (TypeElement) entityClassElement, classElement, table.camelToUnderline()); + fillColumnInfoList(columnInfos, defaultColumns, (TypeElement) entityClassElement, classElement, table.camelToUnderline()); classElement = (TypeElement) typeUtils.asElement(classElement.getSuperclass()); } while (classElement != null); @@ -181,7 +177,7 @@ public class MybatisFlexProcessor extends AbstractProcessor { String tableDefPackage = StrUtil.buildTableDefPackage(entityClass); String tableDefClassName = entityClassName.concat(tableDefClassSuffix); String tableDefContent = ContentBuilder.buildTableDef(table, entityClass, entityClassName, allInTablesEnable, tableDefPackage, tableDefClassName - , tableDefPropertiesNameStyle, tableDefInstanceSuffix, columnInfoList, defaultColumns); + , tableDefPropertiesNameStyle, tableDefInstanceSuffix, columnInfos, defaultColumns); processGenClass(genPath, tableDefPackage, tableDefClassName, tableDefContent); if (allInTablesEnable) { @@ -224,7 +220,7 @@ public class MybatisFlexProcessor extends AbstractProcessor { return SourceVersion.latestSupported(); } - private void fillColumnInfoList(Collection columnInfoList, List defaultColumns, TypeElement baseElement, TypeElement classElement, boolean camelToUnderline) { + private void fillColumnInfoList(Set columnInfos, List defaultColumns, TypeElement baseElement, TypeElement classElement, boolean camelToUnderline) { for (Element fieldElement : classElement.getEnclosedElements()) { // all fields @@ -300,9 +296,8 @@ public class MybatisFlexProcessor extends AbstractProcessor { columnInfo.setProperty(property); columnInfo.setColumn(columnName); columnInfo.setAlias(alias); - columnInfo.setFullClassName(baseElement.getQualifiedName().toString()); - columnInfoList.add(columnInfo); + columnInfos.add(columnInfo); if (column == null || (!column.isLarge() && !column.isLogicDelete())) { defaultColumns.add(columnName); @@ -313,6 +308,9 @@ public class MybatisFlexProcessor extends AbstractProcessor { private String[] getColumnAliasByGetterMethod(TypeElement baseElement, String property) { + if (baseElement == null) { + return null; + } for (Element enclosedElement : baseElement.getEnclosedElements()) { if (ElementKind.METHOD == enclosedElement.getKind()) { String methodName = enclosedElement.toString(); @@ -325,7 +323,7 @@ public class MybatisFlexProcessor extends AbstractProcessor { } } } - return null; + return getColumnAliasByGetterMethod((TypeElement) typeUtils.asElement(baseElement.getSuperclass()), property); } diff --git a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java index def6dc20..069388d0 100644 --- a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java +++ b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java @@ -57,7 +57,7 @@ public class ContentBuilder { public static String buildTableDef(Table table, String entityClass, String entityClassName, boolean allInTablesEnable, String tableDefPackage, String tableDefClassName, String tableDefPropertiesNameStyle, String tableDefInstanceSuffix, - Collection columnInfoList, List defaultColumns) { + Collection columnInfos, List defaultColumns) { StringBuilder content = new StringBuilder("package "); content.append(tableDefPackage).append(";\n\n"); content.append("import com.mybatisflex.core.query.QueryColumn;\n"); @@ -74,7 +74,7 @@ public class ContentBuilder { content.append(" public static final ").append(tableDefClassName).append(' ').append(StrUtil.buildFieldName(entityClassName.concat(tableDefInstanceSuffix != null ? tableDefInstanceSuffix.trim() : ""), tableDefPropertiesNameStyle)) .append(" = new ").append(tableDefClassName).append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n\n"); } - columnInfoList.forEach((columnInfo) -> { + columnInfos.forEach((columnInfo) -> { content.append(" public QueryColumn ") .append(StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle)) .append(" = new QueryColumn(this, \"") @@ -86,7 +86,7 @@ public class ContentBuilder { }); content.append(" public QueryColumn ").append(StrUtil.buildFieldName("allColumns", tableDefPropertiesNameStyle)).append(" = new QueryColumn(this, \"*\");\n"); StringJoiner defaultColumnJoiner = new StringJoiner(", "); - columnInfoList.forEach((columnInfo) -> { + columnInfos.forEach((columnInfo) -> { if (defaultColumns.contains(columnInfo.getColumn())) { defaultColumnJoiner.add(StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle)); } diff --git a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/entity/ColumnInfo.java b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/entity/ColumnInfo.java index 758198e1..dba7c3b3 100644 --- a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/entity/ColumnInfo.java +++ b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/entity/ColumnInfo.java @@ -41,8 +41,6 @@ public class ColumnInfo { */ private String[] alias; - private String fullClassName; - public String getProperty() { return property; } @@ -67,24 +65,21 @@ public class ColumnInfo { this.alias = alias; } - public String getFullClassName() { - return fullClassName; - } - - public void setFullClassName(String fullClassName) { - this.fullClassName = fullClassName; - } - @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } ColumnInfo that = (ColumnInfo) o; - return Objects.equals(property, that.property) && Objects.equals(fullClassName, that.fullClassName); + return Objects.equals(property, that.property); } @Override public int hashCode() { - return Objects.hash(property, fullClassName); + return property != null ? property.hashCode() : 0; } + } \ No newline at end of file From a2ea48979572013101885e22921fd911846f3a0a Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:06:02 +0800 Subject: [PATCH 02/12] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=20APT=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/test/Account.java | 17 +++++++++++ .../java/com/mybatisflex/test/Account2.java | 30 +++++++++++++++++++ .../java/com/mybatisflex/test/AccountVV.java | 27 ++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java index 09432546..c47fef27 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.mybatisflex.test; import com.mybatisflex.annotation.*; @@ -17,6 +33,7 @@ public class Account extends BaseEntity implements Serializable, AgeAware { private static final long serialVersionUID = 1L; @Id(keyType = KeyType.Auto) + @ColumnAlias("account_id") private Long id; @ColumnMask(Masks.CHINESE_NAME) diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java new file mode 100644 index 00000000..32da3644 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.test; + +import com.mybatisflex.annotation.Table; + +import java.io.Serializable; + +@Table(value = "tb_account_2") +public class Account2 extends AccountVV implements Serializable { + + private static final long serialVersionUID = 1L; + + private int age; + +} \ No newline at end of file diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java index 607f62d6..0dd453fe 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java @@ -1,6 +1,25 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.mybatisflex.test; -import com.mybatisflex.annotation.*; +import com.mybatisflex.annotation.ColumnAlias; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; import java.io.Serializable; @@ -16,4 +35,10 @@ public class AccountVV extends Account implements Serializable { private int age; private int ageVV; + + @Override + @ColumnAlias("account_v_v_id") + public Long getId() { + return id; + } } \ No newline at end of file From 59681228c9bad7c405da24b21f80507351d363a1 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:18:31 +0800 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20=E5=8F=96=E6=B6=88=E7=88=B6?= =?UTF-8?q?=E7=B1=BB=E8=AE=BE=E7=BD=AE=E7=9A=84=E5=88=AB=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/processor/MybatisFlexProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java index 8cdd8b79..0d1dcf22 100644 --- a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java +++ b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/MybatisFlexProcessor.java @@ -318,8 +318,10 @@ public class MybatisFlexProcessor extends AbstractProcessor { ColumnAlias columnAlias = enclosedElement.getAnnotation(ColumnAlias.class); if (columnAlias != null) { return columnAlias.value(); + } else { + // 重写方法,忽略别名 + return null; } - break; } } } From 5a3c2fdddf0a535cd2a6a99671a641a2f2ccb9bc Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:18:43 +0800 Subject: [PATCH 04/12] =?UTF-8?q?test:=20=E5=8F=96=E6=B6=88=E7=88=B6?= =?UTF-8?q?=E7=B1=BB=E8=AE=BE=E7=BD=AE=E7=9A=84=E5=88=AB=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/test/Account3.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java new file mode 100644 index 00000000..d85c8bcc --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.test; + +import com.mybatisflex.annotation.Table; + +import java.io.Serializable; + +@Table(value = "tb_account_2") +public class Account3 extends AccountVV implements Serializable { + + private static final long serialVersionUID = 1L; + + private int age; + + @Override + public Long getId() { + return super.getId(); + } +} \ No newline at end of file From d2e10f6569f9490110076a9cd484be95f4c123a3 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:20:48 +0800 Subject: [PATCH 05/12] =?UTF-8?q?test:=20=E5=8F=96=E6=B6=88=E7=88=B6?= =?UTF-8?q?=E7=B1=BB=E8=AE=BE=E7=BD=AE=E7=9A=84=E5=88=AB=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mybatisflex/test/Account3.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java index d85c8bcc..b3cb9d22 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account3.java @@ -20,8 +20,8 @@ import com.mybatisflex.annotation.Table; import java.io.Serializable; -@Table(value = "tb_account_2") -public class Account3 extends AccountVV implements Serializable { +@Table(value = "tb_account_3") +public class Account3 extends Account2 implements Serializable { private static final long serialVersionUID = 1L; From beb6fa1f0a7255dadb24072336d5eda9d6faf01d Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 3 Jul 2023 21:31:37 +0800 Subject: [PATCH 06/12] =?UTF-8?q?test:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=B1=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/test/{AccountVV.java => Account1.java} | 6 +++--- .../src/main/java/com/mybatisflex/test/Account2.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/{AccountVV.java => Account1.java} (85%) diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account1.java similarity index 85% rename from mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java rename to mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account1.java index 0dd453fe..655f1361 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountVV.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account1.java @@ -23,8 +23,8 @@ import com.mybatisflex.annotation.Table; import java.io.Serializable; -@Table(value = "tb_account_vv", dataSource = "ds2", onSet = AccountOnSetListener.class) -public class AccountVV extends Account implements Serializable { +@Table(value = "tb_account_1") +public class Account1 extends Account implements Serializable { private static final long serialVersionUID = 1L; @@ -37,7 +37,7 @@ public class AccountVV extends Account implements Serializable { private int ageVV; @Override - @ColumnAlias("account_v_v_id") + @ColumnAlias("account_1_id") public Long getId() { return id; } diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java index 32da3644..f2ba8e8a 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account2.java @@ -21,7 +21,7 @@ import com.mybatisflex.annotation.Table; import java.io.Serializable; @Table(value = "tb_account_2") -public class Account2 extends AccountVV implements Serializable { +public class Account2 extends Account1 implements Serializable { private static final long serialVersionUID = 1L; From e903b9ed0f3f9523cb8d454cd1f3a74442efa8b0 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:42:43 +0800 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20updateNumber?= =?UTF-8?q?AddByQuery=20=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mybatisflex/core/BaseMapper.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java index f5328358..a72ad182 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java @@ -332,6 +332,20 @@ public interface BaseMapper { @UpdateProvider(type = EntitySqlProvider.class, method = "updateNumberAddByQuery") int updateNumberAddByQuery(@Param(FlexConsts.FIELD_NAME) String fieldName, @Param(FlexConsts.VALUE) Number value, @Param(FlexConsts.QUERY) QueryWrapper queryWrapper); + /** + * 执行类似 update table set field=field+1 where ... 的场景 + * + * @param column 字段名 + * @param value 值( >=0 加,小于 0 减) + * @param queryWrapper 条件 + * @see EntitySqlProvider#updateNumberAddByQuery(Map, ProviderContext) + */ + default int updateNumberAddByQuery(QueryColumn column, Number value, QueryWrapper queryWrapper) { + if (value == null) { + throw FlexExceptions.wrap("value can not be null."); + } + return updateNumberAddByQuery(column.getName(), value, queryWrapper); + } /** * 执行类似 update table set field=field+1 where ... 的场景 From faaa7247bf14dcb56a86535569dcdcd14f2e3984 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:47:30 +0800 Subject: [PATCH 08/12] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=20NPE=20=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/dialect/impl/CommonsDialectImpl.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index 0157e2ce..202163c1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -316,6 +316,11 @@ public class CommonsDialectImpl implements IDialect { @Override public String buildSelectSql(QueryWrapper queryWrapper) { List queryTables = CPI.getQueryTables(queryWrapper); + + if (CollectionUtil.isEmpty(queryTables)) { + throw FlexExceptions.wrap("You must use the 'FROM' clause to select the table."); + } + List joinTables = CPI.getJoinTables(queryWrapper); List allTables = CollectionUtil.merge(queryTables, joinTables); @@ -332,6 +337,11 @@ public class CommonsDialectImpl implements IDialect { QueryColumn selectColumn = selectColumns.get(i); QueryTable selectColumnTable = selectColumn.getTable(); + // function 等没有对应的 selectColumnTable + if (selectColumnTable == null) { + continue; + } + //用户未配置别名的情况下,自动未用户添加别名 if (StringUtil.isBlank(selectColumn.getAlias()) && !(selectColumnTable instanceof SelectQueryTable) From 64ba3ba930a8f29ed532b4c6eba0567c5f1ca4f6 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:50:14 +0800 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20=E6=8F=90=E5=8F=96=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=87=BD=E6=95=B0=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/constant/FuncName.java | 149 ++++++++++++++++++ .../mybatisflex/core/constant/SqlConsts.java | 16 -- 2 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/FuncName.java diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/FuncName.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/FuncName.java new file mode 100644 index 00000000..c77ac6cc --- /dev/null +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/FuncName.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.core.constant; + +/** + * 支持的 SQL 函数名。 + * + * @author 王帅 + * @since 2023-07-03 + */ +public class FuncName { + + public static final String ABS = "ABS"; + public static final String ACOS = "ACOS"; + public static final String ADDDATE = "ADDDATE"; + public static final String ADDTIME = "ADDTIME"; + public static final String ASCII = "ASCII"; + public static final String ASIN = "ASIN"; + public static final String ATAN = "ATAN"; + public static final String AVG = "AVG"; + public static final String BIN = "BIN"; + public static final String CEIL = "CEIL"; + public static final String CEILING = "CEILING"; + public static final String CHARSET = "CHARSET"; + public static final String CHAR_LENGTH = "CHAR_LENGTH"; + public static final String COLLATION = "COLLATION"; + public static final String CONCAT = "CONCAT"; + public static final String CONCAT_WS = "CONCAT_WS"; + public static final String CONNECTION_ID = "CONNECTION_ID"; + public static final String CONV = "CONV"; + public static final String CONVERT = "CONVERT"; + public static final String COS = "COS"; + public static final String COT = "COT"; + public static final String COUNT = "COUNT"; + public static final String CURDATE = "CURDATE"; + public static final String CURRENT_DATE = "CURRENT_DATE"; + public static final String CURRENT_TIME = "CURRENT_TIME"; + public static final String CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP"; + public static final String CURTIME = "CURTIME"; + public static final String DATABASE = "DATABASE"; + public static final String DATEDIFF = "DATEDIFF"; + public static final String DATE_FORMAT = "DATE_FORMAT"; + public static final String DAY = "DAY"; + public static final String DAYNAME = "DAYNAME"; + public static final String DAYOFMONTH = "DAYOFMONTH"; + public static final String DAYOFWEEK = "DAYOFWEEK"; + public static final String DAYOFYEAR = "DAYOFYEAR"; + public static final String DECODE = "DECODE"; + public static final String DEGREES = "DEGREES"; + public static final String ELT = "ELT"; + public static final String ENCODE = "ENCODE"; + public static final String EXP = "EXP"; + public static final String FIELD = "FIELD"; + public static final String FIND_IN_SET = "FIND_IN_SET"; + public static final String FLOOR = "FLOOR"; + public static final String FORMAT = "FORMAT"; + public static final String FROM_DAYS = "FROM_DAYS"; + public static final String FROM_UNIXTIME = "FROM_UNIXTIME"; + public static final String GET_FORMAT = "GET_FORMAT"; + public static final String GET_LOCT = "GET_LOCT"; + public static final String HEX = "HEX"; + public static final String HOUR = "HOUR"; + public static final String INET_ATON = "INET_ATON"; + public static final String INET_NTOA = "INET_NTOA"; + public static final String INSERT = "INSERT"; + public static final String INSTR = "INSTR"; + public static final String IS_FREE_LOCK = "IS_FREE_LOCK"; + public static final String LAST_INSERT_ID = "LAST_INSERT_ID"; + public static final String LEFT = "LEFT"; + public static final String LENGTH = "LENGTH"; + public static final String LOCALTIME = "LOCALTIME"; + public static final String LOCALTIMESTAMP = "LOCALTIMESTAMP"; + public static final String LOG = "LOG"; + public static final String LOG10 = "LOG10"; + public static final String LOWER = "LOWER"; + public static final String LPAD = "LPAD"; + public static final String LTRIM = "LTRIM"; + public static final String MAX = "MAX"; + public static final String MD5 = "MD5"; + public static final String MIN = "MIN"; + public static final String MINUTE = "MINUTE"; + public static final String MOD = "MOD"; + public static final String MONTH = "MONTH"; + public static final String MONTHNAME = "MONTHNAME"; + public static final String NOW = "NOW"; + public static final String OCT = "OCT"; + public static final String PASSWORD = "PASSWORD"; + public static final String PI = "PI"; + public static final String POW = "POW"; + public static final String POWER = "POWER"; + public static final String QUARTER = "QUARTER"; + public static final String RADIANS = "RADIANS"; + public static final String RAND = "RAND"; + public static final String RELEASE_LOCK = "RELEASE_LOCK"; + public static final String REPEAT = "REPEAT"; + public static final String REPLACE = "REPLACE"; + public static final String REVERSE = "REVERSE"; + public static final String RIGHT = "RIGHT"; + public static final String ROUND = "ROUND"; + public static final String RPAD = "RPAD"; + public static final String RTRIM = "RTRIM"; + public static final String SCHEMA = "SCHEMA"; + public static final String SECOND = "SECOND"; + public static final String SEC_TO_TIME = "SEC_TO_TIME"; + public static final String SIGN = "SIGN"; + public static final String SIN = "SIN"; + public static final String SPACE = "SPACE"; + public static final String SQRT = "SQRT"; + public static final String STRCMP = "STRCMP"; + public static final String SUBDATE = "SUBDATE"; + public static final String SUBSTRING = "SUBSTRING"; + public static final String SUBTIME = "SUBTIME"; + public static final String SUM = "SUM"; + public static final String SYSDATE = "SYSDATE"; + public static final String TAN = "TAN"; + public static final String TIME_FORMAT = "TIME_FORMAT"; + public static final String TIME_TO_SEC = "TIME_TO_SEC"; + public static final String TO_DAYS = "TO_DAYS"; + public static final String TRIM = "TRIM"; + public static final String TRUNCATE = "TRUNCATE"; + public static final String UNIX_TIMESTAMP = "UNIX_TIMESTAMP"; + public static final String UPPER = "UPPER"; + public static final String USER = "USER"; + public static final String UTC_DATE = "UTC_DATE"; + public static final String UTC_TIME = "UTC_TIME"; + public static final String VERSION = "VERSION"; + public static final String WEEK = "WEEK"; + public static final String WEEKDAY = "WEEKDAY"; + public static final String WEEKOFYEAR = "WEEKOFYEAR"; + public static final String YEAR = "YEAR"; + + private FuncName() { + } + +} \ No newline at end of file diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/SqlConsts.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/SqlConsts.java index 4c5c0bc1..ad3a7f83 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/SqlConsts.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/constant/SqlConsts.java @@ -113,7 +113,6 @@ public final class SqlConsts { public static final String GE = " >= "; public static final String LT = " < "; public static final String LE = " <= "; - public static final String NOT = " NOT "; public static final String LIKE = " LIKE "; public static final String EQUALS = " = "; public static final String NOT_EQUALS = " != "; @@ -123,8 +122,6 @@ public final class SqlConsts { public static final String NOT_IN = " NOT IN "; public static final String BETWEEN = " BETWEEN "; public static final String NOT_BETWEEN = " NOT BETWEEN "; - public static final String EXISTS = " EXISTS "; - public static final String NOT_EXISTS = " NOT EXISTS "; // === 排序相关关键字 === @@ -135,19 +132,6 @@ public final class SqlConsts { public static final String NULLS_LAST = " NULLS LAST"; - // === SQL 函数名 === - - public static final String SUM = "SUM"; - public static final String MAX = "MAX"; - public static final String MIN = "MIN"; - public static final String AVG = "AVG"; - public static final String DAY = "DAY"; - public static final String YEAR = "YEAR"; - public static final String MONTH = "MONTH"; - public static final String COUNT = "COUNT"; - public static final String CONVERT = "CONVERT"; - - // === 数学运算符 === public static final String PLUS_SIGN = " + "; From a3e5d46e0b2412d9da6b03249703497dd565e301 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:50:33 +0800 Subject: [PATCH 10/12] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E7=9A=84=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/query/QueryMethods.java | 2295 ++++++++++++++++- 1 file changed, 2201 insertions(+), 94 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index a386602f..10cc1395 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -19,235 +19,2342 @@ import com.mybatisflex.core.util.ArrayUtil; import com.mybatisflex.core.util.LambdaGetter; import com.mybatisflex.core.util.LambdaUtil; -import static com.mybatisflex.core.constant.SqlConsts.*; +import static com.mybatisflex.core.constant.FuncName.*; +/** + * SQL 函数。 + */ +@SuppressWarnings("unused") public class QueryMethods { private QueryMethods() { } - /////count - public static FunctionQueryColumn count() { - return new FunctionQueryColumn(COUNT, new StringQueryColumn("*")); + // === 数学函数 === + + /** + * 返回 x 的绝对值。 + */ + public static QueryColumn abs(String columnX) { + return new FunctionQueryColumn(ABS, columnX); } - public static FunctionQueryColumn count(String column) { - return new FunctionQueryColumn(COUNT, column); + /** + * 返回 x 的绝对值。 + */ + public static QueryColumn abs(QueryColumn columnX) { + return new FunctionQueryColumn(ABS, columnX); } - public static FunctionQueryColumn count(QueryColumn column) { - return new FunctionQueryColumn(COUNT, column); + /** + * 返回 x 的绝对值。 + */ + public static QueryColumn abs(LambdaGetter columnX) { + return new FunctionQueryColumn(ABS, LambdaUtil.getQueryColumn(columnX)); } - public static FunctionQueryColumn count(LambdaGetter fn) { - return new FunctionQueryColumn(COUNT, LambdaUtil.getQueryColumn(fn)); + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceil(String columnX) { + return new FunctionQueryColumn(CEIL, columnX); + } + + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceil(QueryColumn columnX) { + return new FunctionQueryColumn(CEIL, columnX); + } + + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceil(LambdaGetter columnX) { + return new FunctionQueryColumn(CEIL, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceiling(String columnX) { + return new FunctionQueryColumn(CEILING, columnX); + } + + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceiling(QueryColumn columnX) { + return new FunctionQueryColumn(CEILING, columnX); + } + + /** + * 返回大于或等于 x 的最小整数(向上取整)。 + */ + public static QueryColumn ceiling(LambdaGetter columnX) { + return new FunctionQueryColumn(CEILING, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回小于或等于 x 的最大整数(向下取整)。 + */ + public static QueryColumn floor(String columnX) { + return new FunctionQueryColumn(FLOOR, columnX); + } + + /** + * 返回小于或等于 x 的最大整数(向下取整)。 + */ + public static QueryColumn floor(QueryColumn columnX) { + return new FunctionQueryColumn(FLOOR, columnX); + } + + /** + * 返回小于或等于 x 的最大整数(向下取整)。 + */ + public static QueryColumn floor(LambdaGetter columnX) { + return new FunctionQueryColumn(FLOOR, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 0~1 的随机数。 + */ + public static QueryColumn rand() { + return new FunctionQueryColumn(RAND); + } + + /** + * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 + */ + public static QueryColumn rand(String columnX) { + return new FunctionQueryColumn(RAND, columnX); + } + + /** + * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 + */ + public static QueryColumn rand(QueryColumn columnX) { + return new FunctionQueryColumn(RAND, columnX); + } + + /** + * 返回 0~1 的随机数,x 值相同时返回的随机数相同。 + */ + public static QueryColumn rand(LambdaGetter columnX) { + return new FunctionQueryColumn(RAND, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 + */ + public static QueryColumn sign(String columnX) { + return new FunctionQueryColumn(SIGN, columnX); + } + + /** + * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 + */ + public static QueryColumn sign(QueryColumn columnX) { + return new FunctionQueryColumn(SIGN, columnX); + } + + /** + * 返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。 + */ + public static QueryColumn sign(LambdaGetter columnX) { + return new FunctionQueryColumn(SIGN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回圆周率。 + */ + public static QueryColumn pi() { + return new FunctionQueryColumn(PI); + } + + /** + * 返回数值 x 保留到小数点后 y 位的值。 + */ + public static QueryColumn truncate(String columnX, String columnY) { + return new FunctionQueryColumn(TRUNCATE, columnX, columnY); + } + + /** + * 返回数值 x 保留到小数点后 y 位的值。 + */ + public static QueryColumn truncate(QueryColumn columnX, QueryColumn columnY) { + return new FunctionQueryColumn(TRUNCATE, columnX, columnY); + } + + /** + * 返回数值 x 保留到小数点后 y 位的值。 + */ + public static QueryColumn truncate(LambdaGetter columnX, LambdaGetter columnY) { + return new FunctionQueryColumn(TRUNCATE, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); + } + + /** + * 返回离 x 最近的整数(四舍五入)。 + */ + public static QueryColumn round(String columnX) { + return new FunctionQueryColumn(ROUND, columnX); + } + + /** + * 返回离 x 最近的整数(四舍五入)。 + */ + public static QueryColumn round(QueryColumn columnX) { + return new FunctionQueryColumn(ROUND, columnX); + } + + /** + * 返回离 x 最近的整数(四舍五入)。 + */ + public static QueryColumn round(LambdaGetter columnX) { + return new FunctionQueryColumn(ROUND, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 + */ + public static QueryColumn round(String columnX, String columnY) { + return new FunctionQueryColumn(ROUND, columnX, columnY); + } + + /** + * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 + */ + public static QueryColumn round(QueryColumn columnX, QueryColumn columnY) { + return new FunctionQueryColumn(ROUND, columnX, columnY); + } + + /** + * 保留 x 小数点后 y 位的值,但截断时要四舍五入。 + */ + public static QueryColumn round(LambdaGetter columnX, LambdaGetter columnY) { + return new FunctionQueryColumn(ROUND, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn pow(String columnX, String columnY) { + return new FunctionQueryColumn(POW, columnX, columnY); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn pow(QueryColumn columnX, QueryColumn columnY) { + return new FunctionQueryColumn(POW, columnX, columnY); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn pow(LambdaGetter columnX, LambdaGetter columnY) { + return new FunctionQueryColumn(POW, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn power(String columnX, String columnY) { + return new FunctionQueryColumn(POWER, columnX, columnY); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn power(QueryColumn columnX, QueryColumn columnY) { + return new FunctionQueryColumn(POWER, columnX, columnY); + } + + /** + * 返回 x 的 y 次方。 + */ + public static QueryColumn power(LambdaGetter columnX, LambdaGetter columnY) { + return new FunctionQueryColumn(POWER, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); + } + + /** + * 返回 x 的平方根。 + */ + public static QueryColumn sqrt(String columnX) { + return new FunctionQueryColumn(SQRT, columnX); + } + + /** + * 返回 x 的平方根。 + */ + public static QueryColumn sqrt(QueryColumn columnX) { + return new FunctionQueryColumn(SQRT, columnX); + } + + /** + * 返回 x 的平方根。 + */ + public static QueryColumn sqrt(LambdaGetter columnX) { + return new FunctionQueryColumn(SQRT, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 e 的 x 次方。 + */ + public static QueryColumn exp(String columnX) { + return new FunctionQueryColumn(EXP, columnX); + } + + /** + * 返回 e 的 x 次方。 + */ + public static QueryColumn exp(QueryColumn columnX) { + return new FunctionQueryColumn(EXP, columnX); + } + + /** + * 返回 e 的 x 次方。 + */ + public static QueryColumn exp(LambdaGetter columnX) { + return new FunctionQueryColumn(EXP, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 x 除以 y 以后的余数。 + */ + public static QueryColumn mod(String columnX, String columnY) { + return new FunctionQueryColumn(MOD, columnX, columnY); + } + + /** + * 返回 x 除以 y 以后的余数。 + */ + public static QueryColumn mod(QueryColumn columnX, QueryColumn columnY) { + return new FunctionQueryColumn(MOD, columnX, columnY); + } + + /** + * 返回 x 除以 y 以后的余数。 + */ + public static QueryColumn mod(LambdaGetter columnX, LambdaGetter columnY) { + return new FunctionQueryColumn(MOD, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnY)); + } + + /** + * 返回自然对数(以 e 为底的对数)。 + */ + public static QueryColumn log(String columnX) { + return new FunctionQueryColumn(LOG, columnX); + } + + /** + * 返回自然对数(以 e 为底的对数)。 + */ + public static QueryColumn log(QueryColumn columnX) { + return new FunctionQueryColumn(LOG, columnX); + } + + /** + * 返回自然对数(以 e 为底的对数)。 + */ + public static QueryColumn log(LambdaGetter columnX) { + return new FunctionQueryColumn(LOG, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回以 10 为底的对数。 + */ + public static QueryColumn log10(String columnX) { + return new FunctionQueryColumn(LOG10, columnX); + } + + /** + * 返回以 10 为底的对数。 + */ + public static QueryColumn log10(QueryColumn columnX) { + return new FunctionQueryColumn(LOG10, columnX); + } + + /** + * 返回以 10 为底的对数。 + */ + public static QueryColumn log10(LambdaGetter columnX) { + return new FunctionQueryColumn(LOG10, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 将角度转换为弧度。 + */ + public static QueryColumn radians(String columnX) { + return new FunctionQueryColumn(RADIANS, columnX); + } + + /** + * 将角度转换为弧度。 + */ + public static QueryColumn radians(QueryColumn columnX) { + return new FunctionQueryColumn(RADIANS, columnX); + } + + /** + * 将角度转换为弧度。 + */ + public static QueryColumn radians(LambdaGetter columnX) { + return new FunctionQueryColumn(RADIANS, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 将弧度转换为角度。 + */ + public static QueryColumn degrees(String columnX) { + return new FunctionQueryColumn(DEGREES, columnX); + } + + /** + * 将弧度转换为角度。 + */ + public static QueryColumn degrees(QueryColumn columnX) { + return new FunctionQueryColumn(DEGREES, columnX); + } + + /** + * 将弧度转换为角度。 + */ + public static QueryColumn degrees(LambdaGetter columnX) { + return new FunctionQueryColumn(DEGREES, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求正弦值。 + */ + public static QueryColumn sin(String columnX) { + return new FunctionQueryColumn(SIN, columnX); + } + + /** + * 求正弦值。 + */ + public static QueryColumn sin(QueryColumn columnX) { + return new FunctionQueryColumn(SIN, columnX); + } + + /** + * 求正弦值。 + */ + public static QueryColumn sin(LambdaGetter columnX) { + return new FunctionQueryColumn(SIN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求反正弦值。 + */ + public static QueryColumn asin(String columnX) { + return new FunctionQueryColumn(ASIN, columnX); + } + + /** + * 求反正弦值。 + */ + public static QueryColumn asin(QueryColumn columnX) { + return new FunctionQueryColumn(ASIN, columnX); + } + + /** + * 求反正弦值。 + */ + public static QueryColumn asin(LambdaGetter columnX) { + return new FunctionQueryColumn(ASIN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求余弦值。 + */ + public static QueryColumn cos(String columnX) { + return new FunctionQueryColumn(COS, columnX); + } + + /** + * 求余弦值。 + */ + public static QueryColumn cos(QueryColumn columnX) { + return new FunctionQueryColumn(COS, columnX); + } + + /** + * 求余弦值。 + */ + public static QueryColumn cos(LambdaGetter columnX) { + return new FunctionQueryColumn(COS, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求反余弦值。 + */ + public static QueryColumn acos(String columnX) { + return new FunctionQueryColumn(ACOS, columnX); + } + + /** + * 求反余弦值。 + */ + public static QueryColumn acos(QueryColumn columnX) { + return new FunctionQueryColumn(ACOS, columnX); + } + + /** + * 求反余弦值。 + */ + public static QueryColumn acos(LambdaGetter columnX) { + return new FunctionQueryColumn(ACOS, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求正切值。 + */ + public static QueryColumn tan(String columnX) { + return new FunctionQueryColumn(TAN, columnX); + } + + /** + * 求正切值。 + */ + public static QueryColumn tan(QueryColumn columnX) { + return new FunctionQueryColumn(TAN, columnX); + } + + /** + * 求正切值。 + */ + public static QueryColumn tan(LambdaGetter columnX) { + return new FunctionQueryColumn(TAN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求反正切值。 + */ + public static QueryColumn atan(String columnX) { + return new FunctionQueryColumn(ATAN, columnX); + } + + /** + * 求反正切值。 + */ + public static QueryColumn atan(QueryColumn columnX) { + return new FunctionQueryColumn(ATAN, columnX); + } + + /** + * 求反正切值。 + */ + public static QueryColumn atan(LambdaGetter columnX) { + return new FunctionQueryColumn(ATAN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 求余切值。 + */ + public static QueryColumn cot(String columnX) { + return new FunctionQueryColumn(COT, columnX); + } + + /** + * 求余切值。 + */ + public static QueryColumn cot(QueryColumn columnX) { + return new FunctionQueryColumn(COT, columnX); + } + + /** + * 求余切值。 + */ + public static QueryColumn cot(LambdaGetter columnX) { + return new FunctionQueryColumn(COT, LambdaUtil.getQueryColumn(columnX)); + } + + // === 字符串函数 === + + /** + * 返回字符串 s 的字符数。 + */ + public static QueryColumn charLength(String columnS) { + return new FunctionQueryColumn(CHAR_LENGTH, columnS); + } + + /** + * 返回字符串 s 的字符数。 + */ + public static QueryColumn charLength(QueryColumn columnS) { + return new FunctionQueryColumn(CHAR_LENGTH, columnS); + } + + /** + * 返回字符串 s 的字符数。 + */ + public static QueryColumn charLength(LambdaGetter columnS) { + return new FunctionQueryColumn(CHAR_LENGTH, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 返回字符串 s 的长度。 + */ + public static QueryColumn length(String columnS) { + return new FunctionQueryColumn(LENGTH, columnS); + } + + /** + * 返回字符串 s 的长度。 + */ + public static QueryColumn length(QueryColumn columnS) { + return new FunctionQueryColumn(LENGTH, columnS); + } + + /** + * 返回字符串 s 的长度。 + */ + public static QueryColumn length(LambdaGetter columnS) { + return new FunctionQueryColumn(LENGTH, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 将字符串 s1,s2 等多个字符串合并为一个字符串。 + */ + public static QueryColumn concat(String columnS1, String columnS2, String... columnN) { + return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new String[]{columnS1, columnS2}, columnN)); + } + + /** + * 将字符串 s1,s2 等多个字符串合并为一个字符串。 + */ + public static QueryColumn concat(QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) { + return new FunctionQueryColumn(CONCAT, ArrayUtil.concat(new QueryColumn[]{columnS1, columnS2}, columnN)); + } + + /** + * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。 + */ + public static QueryColumn concatWs(String columnX, String columnS1, String columnS2, String... columnN) { + return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new String[]{columnX, columnS1, columnS2}, columnN)); + } + + /** + * 同 CONCAT(s1, s2, ...),但是每个字符串之间要加上 x。 + */ + public static QueryColumn concatWs(QueryColumn columnX, QueryColumn columnS1, QueryColumn columnS2, QueryColumn... columnN) { + return new FunctionQueryColumn(CONCAT_WS, ArrayUtil.concat(new QueryColumn[]{columnX, columnS1, columnS2}, columnN)); + } + + /** + * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。 + */ + public static QueryColumn insert(String columnS1, String columnX, String columnLen, String columnS2) { + return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2); + } + + /** + * 将字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串。 + */ + public static QueryColumn insert(QueryColumn columnS1, QueryColumn columnX, QueryColumn columnLen, QueryColumn columnS2) { + return new FunctionQueryColumn(INSERT, columnS1, columnX, columnLen, columnS2); + } + + /** + * 将字符串 s 的所有字符都变成大写字母。 + */ + public static QueryColumn upper(String columnS) { + return new FunctionQueryColumn(UPPER, columnS); + } + + /** + * 将字符串 s 的所有字符都变成大写字母。 + */ + public static QueryColumn upper(QueryColumn columnS) { + return new FunctionQueryColumn(UPPER, columnS); + } + + /** + * 将字符串 s 的所有字符都变成大写字母。 + */ + public static QueryColumn upper(LambdaGetter columnS) { + return new FunctionQueryColumn(UPPER, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 将字符串 s 的所有字符都变成小写字母。 + */ + public static QueryColumn lower(String columnS) { + return new FunctionQueryColumn(LOWER, columnS); + } + + /** + * 将字符串 s 的所有字符都变成小写字母。 + */ + public static QueryColumn lower(QueryColumn columnS) { + return new FunctionQueryColumn(LOWER, columnS); + } + + /** + * 将字符串 s 的所有字符都变成小写字母。 + */ + public static QueryColumn lower(LambdaGetter columnS) { + return new FunctionQueryColumn(LOWER, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 返回字符串 s 的前 n 个字符。 + */ + public static QueryColumn left(String columnS, String columnN) { + return new FunctionQueryColumn(LEFT, columnS, columnN); + } + + /** + * 返回字符串 s 的前 n 个字符。 + */ + public static QueryColumn left(QueryColumn columnS, QueryColumn columnN) { + return new FunctionQueryColumn(LEFT, columnS, columnN); + } + + /** + * 返回字符串 s 的前 n 个字符。 + */ + public static QueryColumn left(LambdaGetter columnS, LambdaGetter columnN) { + return new FunctionQueryColumn(LEFT, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 返回字符串 s 的后 n 个字符。 + */ + public static QueryColumn right(String columnS, String columnN) { + return new FunctionQueryColumn(RIGHT, columnS, columnN); + } + + /** + * 返回字符串 s 的后 n 个字符。 + */ + public static QueryColumn right(QueryColumn columnS, QueryColumn columnN) { + return new FunctionQueryColumn(RIGHT, columnS, columnN); + } + + /** + * 返回字符串 s 的后 n 个字符。 + */ + public static QueryColumn right(LambdaGetter columnS, LambdaGetter columnN) { + return new FunctionQueryColumn(RIGHT, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 + */ + public static QueryColumn lpad(String columnS1, String columnLen, String columnS2) { + return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2); + } + + /** + * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 + */ + public static QueryColumn lpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) { + return new FunctionQueryColumn(LPAD, columnS1, columnLen, columnS2); + } + + /** + * 字符串 s2 来填充 s1 的开始处,使字符串长度达到 len。 + */ + public static QueryColumn lpad(LambdaGetter columnS1, LambdaGetter columnLen, LambdaGetter columnS2) { + return new FunctionQueryColumn(LPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2)); + } + + /** + * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 + */ + public static QueryColumn rpad(String columnS1, String columnLen, String columnS2) { + return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2); + } + + /** + * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 + */ + public static QueryColumn rpad(QueryColumn columnS1, QueryColumn columnLen, QueryColumn columnS2) { + return new FunctionQueryColumn(RPAD, columnS1, columnLen, columnS2); + } + + /** + * 字符串 s2 来填充 s1 的结尾处,使字符串长度达到 len。 + */ + public static QueryColumn rpad(LambdaGetter columnS1, LambdaGetter columnLen, LambdaGetter columnS2) { + return new FunctionQueryColumn(RPAD, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnLen), LambdaUtil.getQueryColumn(columnS2)); + } + + /** + * 去掉字符串 s 开始处的空格。 + */ + public static QueryColumn ltrim(String columnS) { + return new FunctionQueryColumn(LTRIM, columnS); + } + + /** + * 去掉字符串 s 开始处的空格。 + */ + public static QueryColumn ltrim(QueryColumn columnS) { + return new FunctionQueryColumn(LTRIM, columnS); + } + + /** + * 去掉字符串 s 开始处的空格。 + */ + public static QueryColumn ltrim(LambdaGetter columnS) { + return new FunctionQueryColumn(LTRIM, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 去掉字符串 s 结尾处的空格。 + */ + public static QueryColumn rtrim(String columnS) { + return new FunctionQueryColumn(RTRIM, columnS); + } + + /** + * 去掉字符串 s 结尾处的空格。 + */ + public static QueryColumn rtrim(QueryColumn columnS) { + return new FunctionQueryColumn(RTRIM, columnS); + } + + /** + * 去掉字符串 s 结尾处的空格。 + */ + public static QueryColumn rtrim(LambdaGetter columnS) { + return new FunctionQueryColumn(RTRIM, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 去掉字符串 s 开始处和结尾处的空格。 + */ + public static QueryColumn trim(QueryColumn columnS) { + return new FunctionQueryColumn(TRIM, columnS); + } + + /** + * 将字符串 s 重复 n 次。 + */ + public static QueryColumn repeat(String columnS, String columnN) { + return new FunctionQueryColumn(REPEAT, columnS, columnN); + } + + /** + * 将字符串 s 重复 n 次。 + */ + public static QueryColumn repeat(QueryColumn columnS, QueryColumn columnN) { + return new FunctionQueryColumn(REPEAT, columnS, columnN); + } + + /** + * 将字符串 s 重复 n 次。 + */ + public static QueryColumn repeat(LambdaGetter columnS, LambdaGetter columnN) { + return new FunctionQueryColumn(REPEAT, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 返回 n 个空格。 + */ + public static QueryColumn space(String columnN) { + return new FunctionQueryColumn(SPACE, columnN); + } + + /** + * 返回 n 个空格。 + */ + public static QueryColumn space(QueryColumn columnN) { + return new FunctionQueryColumn(SPACE, columnN); + } + + /** + * 返回 n 个空格。 + */ + public static QueryColumn space(LambdaGetter columnN) { + return new FunctionQueryColumn(SPACE, LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 用字符串 s2 代替字符串 s 中的字符串 s1。 + */ + public static QueryColumn replace(String columnS, String columnS1, String columnS2) { + return new FunctionQueryColumn(REPLACE, columnS, columnS1, columnS2); + } + + /** + * 用字符串 s2 代替字符串 s 中的字符串 s1。 + */ + public static QueryColumn replace(QueryColumn columnS, QueryColumn columnS1, QueryColumn columnS2) { + return new FunctionQueryColumn(REPLACE, columnS, columnS1, columnS2); + } + + /** + * 用字符串 s2 代替字符串 s 中的字符串 s1。 + */ + public static QueryColumn replace(LambdaGetter columnS, LambdaGetter columnS1, LambdaGetter columnS2) { + return new FunctionQueryColumn(REPLACE, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); + } + + /** + * 比较字符串 s1 和 s2。 + */ + public static QueryColumn strcmp(String columnS1, String columnS2) { + return new FunctionQueryColumn(STRCMP, columnS1, columnS2); + } + + /** + * 比较字符串 s1 和 s2。 + */ + public static QueryColumn strcmp(QueryColumn columnS1, QueryColumn columnS2) { + return new FunctionQueryColumn(STRCMP, columnS1, columnS2); + } + + /** + * 比较字符串 s1 和 s2。 + */ + public static QueryColumn strcmp(LambdaGetter columnS1, LambdaGetter columnS2) { + return new FunctionQueryColumn(STRCMP, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); + } + + /** + * 获取从字符串 s 中的第 n 个位置开始长度为 len 的字符串。 + */ + public static QueryColumn substring(String columnS, String columnN, String columnLen) { + return new FunctionQueryColumn(SUBSTRING, columnS, columnN, columnLen); + } + + /** + * 获取从字符串 s 中的第 n 个位置开始长度为 len 的字符串。 + */ + public static QueryColumn substring(QueryColumn columnS, QueryColumn columnN, QueryColumn columnLen) { + return new FunctionQueryColumn(SUBSTRING, columnS, columnN, columnLen); + } + + /** + * 获取从字符串 s 中的第 n 个位置开始长度为 len 的字符串。 + */ + public static QueryColumn substring(LambdaGetter columnS, LambdaGetter columnN, LambdaGetter columnLen) { + return new FunctionQueryColumn(SUBSTRING, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnN), LambdaUtil.getQueryColumn(columnLen)); + } + + /** + * 从字符串 s 中获取 s1 的开始位置。 + */ + public static QueryColumn instr(String columnS, String columnS1) { + return new FunctionQueryColumn(INSTR, columnS, columnS1); + } + + /** + * 从字符串 s 中获取 s1 的开始位置。 + */ + public static QueryColumn instr(QueryColumn columnS, QueryColumn columnS1) { + return new FunctionQueryColumn(INSTR, columnS, columnS1); + } + + /** + * 从字符串 s 中获取 s1 的开始位置。 + */ + public static QueryColumn instr(LambdaGetter columnS, LambdaGetter columnS1) { + return new FunctionQueryColumn(INSTR, LambdaUtil.getQueryColumn(columnS), LambdaUtil.getQueryColumn(columnS1)); + } + + /** + * 将字符串 s 的顺序反过来。 + */ + public static QueryColumn reverse(String columnS) { + return new FunctionQueryColumn(REVERSE, columnS); + } + + /** + * 将字符串 s 的顺序反过来。 + */ + public static QueryColumn reverse(QueryColumn columnS) { + return new FunctionQueryColumn(REVERSE, columnS); + } + + /** + * 将字符串 s 的顺序反过来。 + */ + public static QueryColumn reverse(LambdaGetter columnS) { + return new FunctionQueryColumn(REVERSE, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 返回第 n 个字符串。 + */ + public static QueryColumn elt(String columnN, String columnS1, String... columnSn) { + return new FunctionQueryColumn(ELT, ArrayUtil.concat(new String[]{columnN, columnS1}, columnSn)); + } + + /** + * 返回第 n 个字符串。 + */ + public static QueryColumn elt(QueryColumn columnN, QueryColumn columnS1, QueryColumn... columnSn) { + return new FunctionQueryColumn(ELT, ArrayUtil.concat(new QueryColumn[]{columnN, columnS1}, columnSn)); + } + + /** + * 返回第一个与字符串 s 匹配的字符串的位置。 + */ + public static QueryColumn field(String columnS, String columnS1, String... columnSn) { + return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new String[]{columnS, columnS1}, columnSn)); + } + + /** + * 返回第一个与字符串 s 匹配的字符串的位置。 + */ + public static QueryColumn field(QueryColumn columnS, QueryColumn columnS1, QueryColumn... columnSn) { + return new FunctionQueryColumn(FIELD, ArrayUtil.concat(new QueryColumn[]{columnS, columnS1}, columnSn)); + } + + /** + * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 + */ + public static QueryColumn findInSet(String columnS1, String columnS2) { + return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2); + } + + /** + * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 + */ + public static QueryColumn findInSet(QueryColumn columnS1, QueryColumn columnS2) { + return new FunctionQueryColumn(FIND_IN_SET, columnS1, columnS2); + } + + /** + * 返回在字符串 s2 中与 s1 匹配的字符串的位置。 + */ + public static QueryColumn findInSet(LambdaGetter columnS1, LambdaGetter columnS2) { + return new FunctionQueryColumn(FIND_IN_SET, LambdaUtil.getQueryColumn(columnS1), LambdaUtil.getQueryColumn(columnS2)); + } + + // === 日期时间函数 === + + /** + * 返回当前日期。 + */ + public static QueryColumn curDate() { + return new FunctionQueryColumn(CURDATE); + } + + /** + * 返回当前日期。 + */ + public static QueryColumn currentDate() { + return new FunctionQueryColumn(CURRENT_DATE); + } + + /** + * 返回当前时间。 + */ + public static QueryColumn curTime() { + return new FunctionQueryColumn(CURTIME); + } + + /** + * 返回当前时间。 + */ + public static QueryColumn currentTime() { + return new FunctionQueryColumn(CURRENT_TIME); + } + + /** + * 返回当前日期和时间。 + */ + public static QueryColumn now() { + return new FunctionQueryColumn(NOW); + } + + /** + * 返回当前日期和时间。 + */ + public static QueryColumn currentTimestamp() { + return new FunctionQueryColumn(CURRENT_TIMESTAMP); + } + + /** + * 返回当前日期和时间。 + */ + public static QueryColumn localTime() { + return new FunctionQueryColumn(LOCALTIME); + } + + /** + * 返回当前日期和时间。 + */ + public static QueryColumn sysDate() { + return new FunctionQueryColumn(SYSDATE); } - /////max + /** + * 返回当前日期和时间。 + */ + public static QueryColumn localTimestamp() { + return new FunctionQueryColumn(LOCALTIMESTAMP); + } + + /** + * 以 UNIX 时间戳的形式返回当前时间。 + */ + public static QueryColumn unixTimestamp() { + return new FunctionQueryColumn(UNIX_TIMESTAMP); + } + + /** + * 将时间 d 以 UNIX 时间戳的形式返回。 + */ + public static QueryColumn unixTimestamp(String columnD) { + return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD); + } + + /** + * 将时间 d 以 UNIX 时间戳的形式返回。 + */ + public static QueryColumn unixTimestamp(QueryColumn columnD) { + return new FunctionQueryColumn(UNIX_TIMESTAMP, columnD); + } + + /** + * 将时间 d 以 UNIX 时间戳的形式返回。 + */ + public static QueryColumn unixTimestamp(LambdaGetter columnD) { + return new FunctionQueryColumn(UNIX_TIMESTAMP, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 把 UNIX 时间戳的时间转换为普通格式的时间。 + */ + public static QueryColumn fromUnixTime(String columnD) { + return new FunctionQueryColumn(FROM_UNIXTIME, columnD); + } + + /** + * 把 UNIX 时间戳的时间转换为普通格式的时间。 + */ + public static QueryColumn fromUnixTime(QueryColumn columnD) { + return new FunctionQueryColumn(FROM_UNIXTIME, columnD); + } + + /** + * 把 UNIX 时间戳的时间转换为普通格式的时间。 + */ + public static QueryColumn fromUnixTime(LambdaGetter columnD) { + return new FunctionQueryColumn(FROM_UNIXTIME, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回 UTC(国际协调时间)日期。 + */ + public static QueryColumn utcDate() { + return new FunctionQueryColumn(UTC_DATE); + } + + /** + * 返回 UTC 时间。 + */ + public static QueryColumn utcTime() { + return new FunctionQueryColumn(UTC_TIME); + } + + /** + * 返回日期 d 中的月份值,范围是 1~12。 + */ + public static QueryColumn month(String columnD) { + return new FunctionQueryColumn(MONTH, columnD); + } + + /** + * 返回日期 d 中的月份值,范围是 1~12。 + */ + public static QueryColumn month(QueryColumn columnD) { + return new FunctionQueryColumn(MONTH, columnD); + } + + /** + * 返回日期 d 中的月份值,范围是 1~12。 + */ + public static QueryColumn month(LambdaGetter columnD) { + return new FunctionQueryColumn(MONTH, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 中的月份名称,如 january。 + */ + public static QueryColumn monthName(String columnD) { + return new FunctionQueryColumn(MONTHNAME, columnD); + } + + /** + * 返回日期 d 中的月份名称,如 january。 + */ + public static QueryColumn monthName(QueryColumn columnD) { + return new FunctionQueryColumn(MONTHNAME, columnD); + } + + /** + * 返回日期 d 中的月份名称,如 january。 + */ + public static QueryColumn monthName(LambdaGetter columnD) { + return new FunctionQueryColumn(MONTHNAME, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 是星期几,如 Monday。 + */ + public static QueryColumn dayName(String columnD) { + return new FunctionQueryColumn(DAYNAME, columnD); + } + + /** + * 返回日期 d 是星期几,如 Monday。 + */ + public static QueryColumn dayName(QueryColumn columnD) { + return new FunctionQueryColumn(DAYNAME, columnD); + } + + /** + * 返回日期 d 是星期几,如 Monday。 + */ + public static QueryColumn dayName(LambdaGetter columnD) { + return new FunctionQueryColumn(DAYNAME, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 + */ + public static QueryColumn dayOfWeek(String columnD) { + return new FunctionQueryColumn(DAYOFWEEK, columnD); + } + + /** + * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 + */ + public static QueryColumn dayOfWeek(QueryColumn columnD) { + return new FunctionQueryColumn(DAYOFWEEK, columnD); + } + + /** + * 返回日期 d 是星期几,1 表示星期日,2 表示星期二。 + */ + public static QueryColumn dayOfWeek(LambdaGetter columnD) { + return new FunctionQueryColumn(DAYOFWEEK, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 + */ + public static QueryColumn weekday(String columnD) { + return new FunctionQueryColumn(WEEKDAY, columnD); + } + + /** + * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 + */ + public static QueryColumn weekday(QueryColumn columnD) { + return new FunctionQueryColumn(WEEKDAY, columnD); + } + + /** + * 返回日期 d 是星期几,0 表示星期一,1 表示星期二。 + */ + public static QueryColumn weekday(LambdaGetter columnD) { + return new FunctionQueryColumn(WEEKDAY, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 0-53。 + */ + public static QueryColumn week(String columnD) { + return new FunctionQueryColumn(WEEK, columnD); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 0-53。 + */ + public static QueryColumn week(QueryColumn columnD) { + return new FunctionQueryColumn(WEEK, columnD); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 0-53。 + */ + public static QueryColumn week(LambdaGetter columnD) { + return new FunctionQueryColumn(WEEK, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 1-53。 + */ + public static QueryColumn weekOfYear(String columnD) { + return new FunctionQueryColumn(WEEKOFYEAR, columnD); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 1-53。 + */ + public static QueryColumn weekOfYear(QueryColumn columnD) { + return new FunctionQueryColumn(WEEKOFYEAR, columnD); + } + + /** + * 计算日期 d 是本年的第几个星期,范围是 1-53。 + */ + public static QueryColumn weekOfYear(LambdaGetter columnD) { + return new FunctionQueryColumn(WEEKOFYEAR, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算日期 d 是本年的第几天。 + */ + public static QueryColumn dayOfYear(String columnD) { + return new FunctionQueryColumn(DAYOFYEAR, columnD); + } + + /** + * 计算日期 d 是本年的第几天。 + */ + public static QueryColumn dayOfYear(QueryColumn columnD) { + return new FunctionQueryColumn(DAYOFYEAR, columnD); + } + + /** + * 计算日期 d 是本年的第几天。 + */ + public static QueryColumn dayOfYear(LambdaGetter columnD) { + return new FunctionQueryColumn(DAYOFYEAR, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算日期 d 是本月的第几天。 + */ + public static QueryColumn dayOfMonth(String columnD) { + return new FunctionQueryColumn(DAYOFMONTH, columnD); + } + + /** + * 计算日期 d 是本月的第几天。 + */ + public static QueryColumn dayOfMonth(QueryColumn columnD) { + return new FunctionQueryColumn(DAYOFMONTH, columnD); + } + + /** + * 计算日期 d 是本月的第几天。 + */ + public static QueryColumn dayOfMonth(LambdaGetter columnD) { + return new FunctionQueryColumn(DAYOFMONTH, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 中的年份值。 + */ + public static QueryColumn year(String columnD) { + return new FunctionQueryColumn(YEAR, columnD); + } + + /** + * 返回日期 d 中的年份值。 + */ + public static QueryColumn year(QueryColumn columnD) { + return new FunctionQueryColumn(YEAR, columnD); + } + + /** + * 返回日期 d 中的年份值。 + */ + public static QueryColumn year(LambdaGetter columnD) { + return new FunctionQueryColumn(YEAR, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 中的天数值。 + */ + public static FunctionQueryColumn day(String columnD) { + return new FunctionQueryColumn(DAY, columnD); + } + + /** + * 返回日期 d 中的天数值。 + */ + public static FunctionQueryColumn day(QueryColumn columnD) { + return new FunctionQueryColumn(DAY, columnD); + } + + /** + * 返回日期 d 中的天数值。 + */ + public static FunctionQueryColumn day(LambdaGetter columnD) { + return new FunctionQueryColumn(DAY, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回日期 d 是第几季度,范围 1-4。 + */ + public static QueryColumn quarter(String columnD) { + return new FunctionQueryColumn(QUARTER, columnD); + } + + /** + * 返回日期 d 是第几季度,范围 1-4。 + */ + public static QueryColumn quarter(QueryColumn columnD) { + return new FunctionQueryColumn(QUARTER, columnD); + } + + /** + * 返回日期 d 是第几季度,范围 1-4。 + */ + public static QueryColumn quarter(LambdaGetter columnD) { + return new FunctionQueryColumn(QUARTER, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 返回时间 t 中的小时值。 + */ + public static QueryColumn hour(String columnT) { + return new FunctionQueryColumn(HOUR, columnT); + } + + /** + * 返回时间 t 中的小时值。 + */ + public static QueryColumn hour(QueryColumn columnT) { + return new FunctionQueryColumn(HOUR, columnT); + } + + /** + * 返回时间 t 中的小时值。 + */ + public static QueryColumn hour(LambdaGetter columnT) { + return new FunctionQueryColumn(HOUR, LambdaUtil.getQueryColumn(columnT)); + } + + /** + * 返回时间 t 中的分钟值。 + */ + public static QueryColumn minute(String columnT) { + return new FunctionQueryColumn(MINUTE, columnT); + } + + /** + * 返回时间 t 中的分钟值。 + */ + public static QueryColumn minute(QueryColumn columnT) { + return new FunctionQueryColumn(MINUTE, columnT); + } + + /** + * 返回时间 t 中的分钟值。 + */ + public static QueryColumn minute(LambdaGetter columnT) { + return new FunctionQueryColumn(MINUTE, LambdaUtil.getQueryColumn(columnT)); + } + + /** + * 返回时间 t 中的秒钟值。 + */ + public static QueryColumn second(String columnT) { + return new FunctionQueryColumn(SECOND, columnT); + } + + /** + * 返回时间 t 中的秒钟值。 + */ + public static QueryColumn second(QueryColumn columnT) { + return new FunctionQueryColumn(SECOND, columnT); + } + + /** + * 返回时间 t 中的秒钟值。 + */ + public static QueryColumn second(LambdaGetter columnT) { + return new FunctionQueryColumn(SECOND, LambdaUtil.getQueryColumn(columnT)); + } + + /** + * 将时间 t 转换为秒。 + */ + public static QueryColumn timeToSec(String columnT) { + return new FunctionQueryColumn(TIME_TO_SEC, columnT); + } + + /** + * 将时间 t 转换为秒。 + */ + public static QueryColumn timeToSec(QueryColumn columnT) { + return new FunctionQueryColumn(TIME_TO_SEC, columnT); + } + + /** + * 将时间 t 转换为秒。 + */ + public static QueryColumn timeToSec(LambdaGetter columnT) { + return new FunctionQueryColumn(TIME_TO_SEC, LambdaUtil.getQueryColumn(columnT)); + } + + /** + * 将以秒为单位的时间 s 转换为时分秒的格式。 + */ + public static QueryColumn secToTime(String columnS) { + return new FunctionQueryColumn(SEC_TO_TIME, columnS); + } + + /** + * 将以秒为单位的时间 s 转换为时分秒的格式。 + */ + public static QueryColumn secToTime(QueryColumn columnS) { + return new FunctionQueryColumn(SEC_TO_TIME, columnS); + } + + /** + * 将以秒为单位的时间 s 转换为时分秒的格式。 + */ + public static QueryColumn secToTime(LambdaGetter columnS) { + return new FunctionQueryColumn(SEC_TO_TIME, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 计算日期 d 到 0000 年 1 月 1 日的天数。 + */ + public static QueryColumn toDays(String columnD) { + return new FunctionQueryColumn(TO_DAYS, columnD); + } + + /** + * 计算日期 d 到 0000 年 1 月 1 日的天数。 + */ + public static QueryColumn toDays(QueryColumn columnD) { + return new FunctionQueryColumn(TO_DAYS, columnD); + } + + /** + * 计算日期 d 到 0000 年 1 月 1 日的天数。 + */ + public static QueryColumn toDays(LambdaGetter columnD) { + return new FunctionQueryColumn(TO_DAYS, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 + */ + public static QueryColumn fromDays(String columnD) { + return new FunctionQueryColumn(FROM_DAYS, columnD); + } + + /** + * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 + */ + public static QueryColumn fromDays(QueryColumn columnD) { + return new FunctionQueryColumn(FROM_DAYS, columnD); + } + + /** + * 计算从 0000 年 1 月 1 日开始 n 天后的日期。 + */ + public static QueryColumn fromDays(LambdaGetter columnD) { + return new FunctionQueryColumn(FROM_DAYS, LambdaUtil.getQueryColumn(columnD)); + } + + /** + * 计算日期 d1 到 d2 之间相隔的天数。 + */ + public static QueryColumn dateDiff(String columnD1, String columnD2) { + return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2); + } + + /** + * 计算日期 d1 到 d2 之间相隔的天数。 + */ + public static QueryColumn dateDiff(QueryColumn columnD1, QueryColumn columnD2) { + return new FunctionQueryColumn(DATEDIFF, columnD1, columnD2); + } + + /** + * 计算日期 d1 到 d2 之间相隔的天数。 + */ + public static QueryColumn dateDiff(LambdaGetter columnD1, LambdaGetter columnD2) { + return new FunctionQueryColumn(DATEDIFF, LambdaUtil.getQueryColumn(columnD1), LambdaUtil.getQueryColumn(columnD2)); + } + + /** + * 计算开始日期 d 加上 n 天的日期。 + */ + public static QueryColumn addDate(String columnD, String columnN) { + return new FunctionQueryColumn(ADDDATE, columnD, columnN); + } + + /** + * 计算开始日期 d 加上 n 天的日期。 + */ + public static QueryColumn addDate(QueryColumn columnD, QueryColumn columnN) { + return new FunctionQueryColumn(ADDDATE, columnD, columnN); + } + + /** + * 计算开始日期 d 加上 n 天的日期。 + */ + public static QueryColumn addDate(LambdaGetter columnD, LambdaGetter columnN) { + return new FunctionQueryColumn(ADDDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 计算起始日期 d 减去 n 天的日期。 + */ + public static QueryColumn subDate(String columnD, String columnN) { + return new FunctionQueryColumn(SUBDATE, columnD, columnN); + } + + /** + * 计算起始日期 d 减去 n 天的日期。 + */ + public static QueryColumn subDate(QueryColumn columnD, QueryColumn columnN) { + return new FunctionQueryColumn(SUBDATE, columnD, columnN); + } + + /** + * 计算起始日期 d 减去 n 天的日期。 + */ + public static QueryColumn subDate(LambdaGetter columnD, LambdaGetter columnN) { + return new FunctionQueryColumn(SUBDATE, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 计算起始时间 t 加上 n 秒的时间。 + */ + public static QueryColumn addTime(String columnT, String columnN) { + return new FunctionQueryColumn(ADDTIME, columnT, columnN); + } + + /** + * 计算起始时间 t 加上 n 秒的时间。 + */ + public static QueryColumn addTime(QueryColumn columnT, QueryColumn columnN) { + return new FunctionQueryColumn(ADDTIME, columnT, columnN); + } + + /** + * 计算起始时间 t 加上 n 秒的时间。 + */ + public static QueryColumn addTime(LambdaGetter columnT, LambdaGetter columnN) { + return new FunctionQueryColumn(ADDTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 计算起始时间 t 减去 n 秒的时间。 + */ + public static QueryColumn subTime(String columnT, String columnN) { + return new FunctionQueryColumn(SUBTIME, columnT, columnN); + } + + /** + * 计算起始时间 t 减去 n 秒的时间。 + */ + public static QueryColumn subTime(QueryColumn columnT, QueryColumn columnN) { + return new FunctionQueryColumn(SUBTIME, columnT, columnN); + } + + /** + * 计算起始时间 t 减去 n 秒的时间。 + */ + public static QueryColumn subTime(LambdaGetter columnT, LambdaGetter columnN) { + return new FunctionQueryColumn(SUBTIME, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 按照表达式 f 的要求显示日期 d。 + */ + public static QueryColumn dateFormat(String columnD, String columnF) { + return new FunctionQueryColumn(DATE_FORMAT, columnD, columnF); + } + + /** + * 按照表达式 f 的要求显示日期 d。 + */ + public static QueryColumn dateFormat(QueryColumn columnD, QueryColumn columnF) { + return new FunctionQueryColumn(DATE_FORMAT, columnD, columnF); + } + + /** + * 按照表达式 f 的要求显示日期 d。 + */ + public static QueryColumn dateFormat(LambdaGetter columnD, LambdaGetter columnF) { + return new FunctionQueryColumn(DATE_FORMAT, LambdaUtil.getQueryColumn(columnD), LambdaUtil.getQueryColumn(columnF)); + } + + /** + * 按照表达式 f 的要求显示时间 t。 + */ + public static QueryColumn timeFormat(String columnT, String columnF) { + return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF); + } + + /** + * 按照表达式 f 的要求显示时间 t。 + */ + public static QueryColumn timeFormat(QueryColumn columnT, QueryColumn columnF) { + return new FunctionQueryColumn(TIME_FORMAT, columnT, columnF); + } + + /** + * 按照表达式 f 的要求显示时间 t。 + */ + public static QueryColumn timeFormat(LambdaGetter columnT, LambdaGetter columnF) { + return new FunctionQueryColumn(TIME_FORMAT, LambdaUtil.getQueryColumn(columnT), LambdaUtil.getQueryColumn(columnF)); + } + + /** + * 根据字符串 s 获取 type 类型数据的显示格式。 + */ + public static QueryColumn getFormat(String columnType, String columnS) { + return new FunctionQueryColumn(GET_FORMAT, columnType, columnS); + } + + /** + * 根据字符串 s 获取 type 类型数据的显示格式。 + */ + public static QueryColumn getFormat(QueryColumn columnType, QueryColumn columnS) { + return new FunctionQueryColumn(GET_FORMAT, columnType, columnS); + } + + /** + * 根据字符串 s 获取 type 类型数据的显示格式。 + */ + public static QueryColumn getFormat(LambdaGetter columnType, LambdaGetter columnS) { + return new FunctionQueryColumn(GET_FORMAT, LambdaUtil.getQueryColumn(columnType), LambdaUtil.getQueryColumn(columnS)); + } + + // === 系统信息函数 === + + /** + * 返回数据库的版本号。 + */ + public static QueryColumn version() { + return new FunctionQueryColumn(VERSION); + } + + /** + * 返回服务器的连接数。 + */ + public static QueryColumn connectionId() { + return new FunctionQueryColumn(CONNECTION_ID); + } + + /** + * 返回当前数据库名。 + */ + public static QueryColumn database() { + return new FunctionQueryColumn(DATABASE); + } + + /** + * 返回当前数据库 schema。 + */ + public static QueryColumn schema() { + return new FunctionQueryColumn(SCHEMA); + } + + /** + * 返回当前用户的名称。 + */ + public static QueryColumn user() { + return new FunctionQueryColumn(USER); + } + + /** + * 返回字符串 str 的字符集。 + */ + public static QueryColumn charset(String columnStr) { + return new FunctionQueryColumn(CHARSET, columnStr); + } + + /** + * 返回字符串 str 的字符集。 + */ + public static QueryColumn charset(QueryColumn columnStr) { + return new FunctionQueryColumn(CHARSET, columnStr); + } + + /** + * 返回字符串 str 的字符集。 + */ + public static QueryColumn charset(LambdaGetter columnStr) { + return new FunctionQueryColumn(CHARSET, LambdaUtil.getQueryColumn(columnStr)); + } + + /** + * 返回字符串 str 的字符排列方式。 + */ + public static QueryColumn collation(String columnStr) { + return new FunctionQueryColumn(COLLATION, columnStr); + } + + /** + * 返回字符串 str 的字符排列方式。 + */ + public static QueryColumn collation(QueryColumn columnStr) { + return new FunctionQueryColumn(COLLATION, columnStr); + } + + /** + * 返回字符串 str 的字符排列方式。 + */ + public static QueryColumn collation(LambdaGetter columnStr) { + return new FunctionQueryColumn(COLLATION, LambdaUtil.getQueryColumn(columnStr)); + } + + /** + * 返回最后生成的 auto_increment 值。 + */ + public static QueryColumn lastInsertId() { + return new FunctionQueryColumn(LAST_INSERT_ID); + } + + // === 加密函数 === + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn password(String columnStr) { + return new FunctionQueryColumn(PASSWORD, columnStr); + } + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn password(QueryColumn columnStr) { + return new FunctionQueryColumn(PASSWORD, columnStr); + } + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn password(LambdaGetter columnStr) { + return new FunctionQueryColumn(PASSWORD, LambdaUtil.getQueryColumn(columnStr)); + } + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn md5(String columnStr) { + return new FunctionQueryColumn(MD5, columnStr); + } + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn md5(QueryColumn columnStr) { + return new FunctionQueryColumn(MD5, columnStr); + } + + /** + * 对字符串 str 进行加密。 + */ + public static QueryColumn md5(LambdaGetter columnStr) { + return new FunctionQueryColumn(MD5, LambdaUtil.getQueryColumn(columnStr)); + } + + /** + * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 + */ + public static QueryColumn encode(String columnStr, String columnPswdStr) { + return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr); + } + + /** + * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 + */ + public static QueryColumn encode(QueryColumn columnStr, QueryColumn columnPswdStr) { + return new FunctionQueryColumn(ENCODE, columnStr, columnPswdStr); + } + + /** + * 使用字符串 pswd_str 来加密字符串 str,加密结果是一个二进制数,必须使用 BLOB 类型来保持它。 + */ + public static QueryColumn encode(LambdaGetter columnStr, LambdaGetter

columnPswdStr) { + return new FunctionQueryColumn(ENCODE, LambdaUtil.getQueryColumn(columnStr), LambdaUtil.getQueryColumn(columnPswdStr)); + } + + /** + * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 + */ + public static QueryColumn decode(String columnCryptStr, String columnPswdStr) { + return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr); + } + + /** + * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 + */ + public static QueryColumn decode(QueryColumn columnCryptStr, QueryColumn columnPswdStr) { + return new FunctionQueryColumn(DECODE, columnCryptStr, columnPswdStr); + } + + /** + * 解密函数,使用字符串 pswd_str 来为 crypt_str 解密。 + */ + public static QueryColumn decode(LambdaGetter columnCryptStr, LambdaGetter

columnPswdStr) { + return new FunctionQueryColumn(DECODE, LambdaUtil.getQueryColumn(columnCryptStr), LambdaUtil.getQueryColumn(columnPswdStr)); + } + + // === 其他函数 === + + /** + * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 + */ + public static QueryColumn format(String columnX, String columnN) { + return new FunctionQueryColumn(FORMAT, columnX, columnN); + } + + /** + * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 + */ + public static QueryColumn format(QueryColumn columnX, QueryColumn columnN) { + return new FunctionQueryColumn(FORMAT, columnX, columnN); + } + + /** + * 格式化函数,可以将数字 x 进行格式化,将 x 保留到小数点后 n 位,这个过程需要进行四舍五入。 + */ + public static QueryColumn format(LambdaGetter columnX, LambdaGetter columnN) { + return new FunctionQueryColumn(FORMAT, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnN)); + } + + /** + * 返回字符串 s 的第一个字符的 ASSCII 码。 + */ + public static QueryColumn ascii(String columnS) { + return new FunctionQueryColumn(ASCII, columnS); + } + + /** + * 返回字符串 s 的第一个字符的 ASSCII 码。 + */ + public static QueryColumn ascii(QueryColumn columnS) { + return new FunctionQueryColumn(ASCII, columnS); + } + + /** + * 返回字符串 s 的第一个字符的 ASSCII 码。 + */ + public static QueryColumn ascii(LambdaGetter columnS) { + return new FunctionQueryColumn(ASCII, LambdaUtil.getQueryColumn(columnS)); + } + + /** + * 返回 x 的二进制编码。 + */ + public static QueryColumn bin(String columnX) { + return new FunctionQueryColumn(BIN, columnX); + } + + /** + * 返回 x 的二进制编码。 + */ + public static QueryColumn bin(QueryColumn columnX) { + return new FunctionQueryColumn(BIN, columnX); + } + + /** + * 返回 x 的二进制编码。 + */ + public static QueryColumn bin(LambdaGetter columnX) { + return new FunctionQueryColumn(BIN, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 x 的十六进制编码。 + */ + public static QueryColumn hex(String columnX) { + return new FunctionQueryColumn(HEX, columnX); + } + + /** + * 返回 x 的十六进制编码。 + */ + public static QueryColumn hex(QueryColumn columnX) { + return new FunctionQueryColumn(HEX, columnX); + } + + /** + * 返回 x 的十六进制编码。 + */ + public static QueryColumn hex(LambdaGetter columnX) { + return new FunctionQueryColumn(HEX, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 返回 x 的八进制编码。 + */ + public static QueryColumn oct(String columnX) { + return new FunctionQueryColumn(OCT, columnX); + } + + /** + * 返回 x 的八进制编码。 + */ + public static QueryColumn oct(QueryColumn columnX) { + return new FunctionQueryColumn(OCT, columnX); + } + + /** + * 返回 x 的八进制编码。 + */ + public static QueryColumn oct(LambdaGetter columnX) { + return new FunctionQueryColumn(OCT, LambdaUtil.getQueryColumn(columnX)); + } + + /** + * 将 x 从 f1 进制数变成 f2 进制数。 + */ + public static QueryColumn conv(String columnX, String columnF1, String columnF2) { + return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2); + } + + /** + * 将 x 从 f1 进制数变成 f2 进制数。 + */ + public static QueryColumn conv(QueryColumn columnX, QueryColumn columnF1, QueryColumn columnF2) { + return new FunctionQueryColumn(CONV, columnX, columnF1, columnF2); + } + + /** + * 将 x 从 f1 进制数变成 f2 进制数。 + */ + public static QueryColumn conv(LambdaGetter columnX, LambdaGetter columnF1, LambdaGetter columnF2) { + return new FunctionQueryColumn(CONV, LambdaUtil.getQueryColumn(columnX), LambdaUtil.getQueryColumn(columnF1), LambdaUtil.getQueryColumn(columnF2)); + } + + /** + * 将 IP 地址转换为数字表示,IP 值需要加上引号。 + */ + public static QueryColumn inetAton(String columnIP) { + return new FunctionQueryColumn(INET_ATON, columnIP); + } + + /** + * 将 IP 地址转换为数字表示,IP 值需要加上引号。 + */ + public static QueryColumn inetAton(QueryColumn columnIP) { + return new FunctionQueryColumn(INET_ATON, columnIP); + } + + /** + * 将 IP 地址转换为数字表示,IP 值需要加上引号。 + */ + public static QueryColumn inetAton(LambdaGetter columnIP) { + return new FunctionQueryColumn(INET_ATON, LambdaUtil.getQueryColumn(columnIP)); + } + + /** + * 可以将数字 n 转换成 IP 的形式。 + */ + public static QueryColumn inetNtoa(String columnN) { + return new FunctionQueryColumn(INET_NTOA, columnN); + } + + /** + * 可以将数字 n 转换成 IP 的形式。 + */ + public static QueryColumn inetNtoa(QueryColumn columnN) { + return new FunctionQueryColumn(INET_NTOA, columnN); + } + + /** + * 可以将数字 n 转换成 IP 的形式。 + */ + public static QueryColumn inetNtoa(LambdaGetter columnN) { + return new FunctionQueryColumn(INET_NTOA, LambdaUtil.getQueryColumn(columnN)); + } + + // === 聚合函数 === + + /** + * 返回指定列的最大值。 + */ public static FunctionQueryColumn max(String column) { return new FunctionQueryColumn(MAX, column); } + /** + * 返回指定列的最大值。 + */ public static FunctionQueryColumn max(QueryColumn column) { return new FunctionQueryColumn(MAX, column); } - public static FunctionQueryColumn max(LambdaGetter fn) { - return new FunctionQueryColumn(MAX, LambdaUtil.getQueryColumn(fn)); + /** + * 返回指定列的最大值。 + */ + public static FunctionQueryColumn max(LambdaGetter column) { + return new FunctionQueryColumn(MAX, LambdaUtil.getQueryColumn(column)); } - - /////min + /** + * 返回指定列的最小值。 + */ public static FunctionQueryColumn min(String column) { return new FunctionQueryColumn(MIN, column); } + /** + * 返回指定列的最小值。 + */ public static FunctionQueryColumn min(QueryColumn column) { return new FunctionQueryColumn(MIN, column); } - public static FunctionQueryColumn min(LambdaGetter fn) { - return new FunctionQueryColumn(MIN, LambdaUtil.getQueryColumn(fn)); + /** + * 返回指定列的最小值。 + */ + public static FunctionQueryColumn min(LambdaGetter column) { + return new FunctionQueryColumn(MIN, LambdaUtil.getQueryColumn(column)); } - - /////avg + /** + * 返回指定列的平均值。 + */ public static FunctionQueryColumn avg(String column) { return new FunctionQueryColumn(AVG, column); } + /** + * 返回指定列的平均值。 + */ public static FunctionQueryColumn avg(QueryColumn column) { return new FunctionQueryColumn(AVG, column); } - public static FunctionQueryColumn avg(LambdaGetter fn) { - return new FunctionQueryColumn(AVG, LambdaUtil.getQueryColumn(fn)); + /** + * 返回指定列的平均值。 + */ + public static FunctionQueryColumn avg(LambdaGetter column) { + return new FunctionQueryColumn(AVG, LambdaUtil.getQueryColumn(column)); } - - /////sum + /** + * 返回指定字段值的和。 + */ public static FunctionQueryColumn sum(String column) { return new FunctionQueryColumn(SUM, column); } + /** + * 返回指定字段值的和。 + */ public static FunctionQueryColumn sum(QueryColumn column) { return new FunctionQueryColumn(SUM, column); } - public static FunctionQueryColumn sum(LambdaGetter fn) { - return new FunctionQueryColumn(SUM, LambdaUtil.getQueryColumn(fn)); + /** + * 返回指定字段值的和。 + */ + public static FunctionQueryColumn sum(LambdaGetter column) { + return new FunctionQueryColumn(SUM, LambdaUtil.getQueryColumn(column)); + } + + // === COUNT === + + /** + * 返回指定列的总行数。 + */ + public static FunctionQueryColumn count() { + return new FunctionQueryColumn(COUNT, new StringQueryColumn("*")); + } + + /** + * 返回指定列的总行数。 + */ + public static FunctionQueryColumn count(String column) { + return new FunctionQueryColumn(COUNT, column); + } + + /** + * 返回指定列的总行数。 + */ + public static FunctionQueryColumn count(QueryColumn column) { + return new FunctionQueryColumn(COUNT, column); + } + + /** + * 返回指定列的总行数。 + */ + public static FunctionQueryColumn count(LambdaGetter column) { + return new FunctionQueryColumn(COUNT, LambdaUtil.getQueryColumn(column)); } - /////year - public static FunctionQueryColumn year(String column) { - return new FunctionQueryColumn(YEAR, column); - } + // === DISTINCT === - - public static FunctionQueryColumn year(QueryColumn column) { - return new FunctionQueryColumn(YEAR, column); - } - - public static FunctionQueryColumn year(LambdaGetter fn) { - return new FunctionQueryColumn(YEAR, LambdaUtil.getQueryColumn(fn)); - } - - - /////month - public static FunctionQueryColumn month(String column) { - return new FunctionQueryColumn(MONTH, column); - } - - public static FunctionQueryColumn month(QueryColumn column) { - return new FunctionQueryColumn(MONTH, column); - } - - public static FunctionQueryColumn month(LambdaGetter fn) { - return new FunctionQueryColumn(MONTH, LambdaUtil.getQueryColumn(fn)); - } - - - /////month - public static FunctionQueryColumn day(String column) { - return new FunctionQueryColumn(DAY, column); - } - - public static FunctionQueryColumn day(QueryColumn column) { - return new FunctionQueryColumn(DAY, column); - } - - public static FunctionQueryColumn day(LambdaGetter fn) { - return new FunctionQueryColumn(DAY, LambdaUtil.getQueryColumn(fn)); - } - - - /////distinct + /** + * 对指定列进行去重。 + */ public static DistinctQueryColumn distinct(QueryColumn... columns) { return new DistinctQueryColumn(columns); } + // === CASE THEN ELSE === - /////case then else ... + /** + * 构建 case then when 语句。 + */ public static CaseQueryColumn.Builder case_() { return new CaseQueryColumn.Builder(); } - public static CaseSearchQueryColumn.Builder case_(QueryColumn queryColumn) { - return new CaseSearchQueryColumn.Builder(queryColumn); + /** + * 构建 case then when 语句。 + */ + public static CaseSearchQueryColumn.Builder case_(QueryColumn column) { + return new CaseSearchQueryColumn.Builder(column); } + // === CONVERT === - //CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) + /** + * 将所给类型类型转换为另一种类型。 + */ public static StringFunctionQueryColumn convert(String... params) { return new StringFunctionQueryColumn(CONVERT, params); } - ///CONCAT - public static FunctionQueryColumn concat(String column1, String column2, String... more) { - String[] columns = new String[]{column1, column2}; - columns = ArrayUtil.concat(columns, more); - return new FunctionQueryColumn("CONCAT", columns); + // === 构建 column 列 === + + /** + * 构建数字常量。 + */ + public static QueryColumn number(Number n) { + return new StringQueryColumn(n.toString()); } - public static FunctionQueryColumn concat(QueryColumn column1, QueryColumn column2, QueryColumn... more) { - QueryColumn[] columns = new QueryColumn[]{column1, column2}; - columns = ArrayUtil.concat(columns, more); - return new FunctionQueryColumn("CONCAT", columns); + /** + * 构建数字常量。 + */ + public static QueryColumn string(String s) { + return new StringQueryColumn("'" + s + "'"); } - - ///column - public static StringQueryColumn column(String column) { + /** + * 构建自定义列。 + */ + public static QueryColumn column(String column) { return new StringQueryColumn(column); } + /** + * 构建自定义列。 + */ public static QueryColumn column(String table, String column) { return new QueryColumn(table, column); } + /** + * 构建自定义列。 + */ public static QueryColumn column(String schema, String table, String column) { return new QueryColumn(schema, table, column); } - public static QueryColumn column(LambdaGetter fn) { - return LambdaUtil.getQueryColumn(fn); + /** + * 构建自定义列。 + */ + public static QueryColumn column(LambdaGetter column) { + return LambdaUtil.getQueryColumn(column); } - public static SelectQueryColumn column(QueryWrapper queryWrapper) { + /** + * 构建自定义列。 + */ + public static QueryColumn column(QueryWrapper queryWrapper) { return new SelectQueryColumn(queryWrapper); } + // === 构建 QueryCondition 查询条件 === + + /** + * EXIST (SELECT ...) + */ public static QueryCondition exists(QueryWrapper queryWrapper) { - return new OperatorSelectCondition(EXISTS, queryWrapper); + return new OperatorSelectCondition("EXISTS ", queryWrapper); } + /** + * NOT EXIST (SELECT ...) + */ public static QueryCondition notExists(QueryWrapper queryWrapper) { - return new OperatorSelectCondition(NOT_EXISTS, queryWrapper); + return new OperatorSelectCondition("NOT EXISTS ", queryWrapper); } + /** + * NOT (id = 1) + */ public static QueryCondition not(QueryCondition childCondition) { - return new OperatorQueryCondition(NOT, childCondition); + return new OperatorQueryCondition("NOT ", childCondition); } + /** + * 空条件。 + */ public static QueryCondition noCondition() { return QueryCondition.createEmpty(); } + // === 构建 QueryWrapper 查询 === - // QueryWrapper methods + /** + * SELECT queryColumns FROM table + */ public static QueryWrapper select(QueryColumn... queryColumns) { return newWrapper().select(queryColumns); } + /** + * SELECT * FROM table UNION SELECT ... + */ public static QueryWrapper union(QueryWrapper queryWrapper) { return newWrapper().union(queryWrapper); } + /** + * SELECT 1 FROM table + */ public static QueryWrapper selectOne() { return select(column("1")); } + /** + * SELECT COUNT(*) FROM table + */ public static QueryWrapper selectCount() { return select(count()); } + /** + * SELECT COUNT(1) FROM table + */ public static QueryWrapper selectCountOne() { return select(count("1")); } - + /** + * SELECT * FROM table + */ private static QueryWrapper newWrapper() { return new QueryWrapper(); } + // 构建原生 SQL 条件 - public static RawFragment raw(String raw) { + /** + * 构建原生查询条件。 + */ + public static QueryCondition raw(String raw) { return new RawFragment(raw); } - public static RawFragment raw(String raw, Object... params) { + /** + * 构建原生查询条件,并附带参数。 + */ + public static QueryCondition raw(String raw, Object... params) { return new RawFragment(raw, params); } From 34c9ba3b12d9b086562d56225e4e780711b6caac Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:50:49 +0800 Subject: [PATCH 11/12] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/coretest/FunctionSqlTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java index 62f73ccb..dc087f22 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/FunctionSqlTest.java @@ -21,6 +21,7 @@ import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.StringQueryColumn; import org.junit.Test; +import static com.mybatisflex.core.query.QueryMethods.*; import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; /** @@ -40,4 +41,15 @@ public class FunctionSqlTest { System.out.println(sql); } + @Test + public void test02() { + String sql = QueryWrapper.create() + .select(concatWs(string("abc"), ACCOUNT.USER_NAME, ACCOUNT.BIRTHDAY)) + .select(abs(number(-3))) + .from(ACCOUNT) + .where(not(ACCOUNT.ID.eq(1))) + .toSQL(); + System.out.println(sql); + } + } \ No newline at end of file From 03820fc907cba45ec463acbe0b1e7d62a20e6faa Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 10:51:07 +0800 Subject: [PATCH 12/12] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/base/querywrapper.md | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/docs/zh/base/querywrapper.md b/docs/zh/base/querywrapper.md index b312be87..c7072ad1 100644 --- a/docs/zh/base/querywrapper.md +++ b/docs/zh/base/querywrapper.md @@ -127,18 +127,8 @@ FROM tb_account -目前,MyBatis-Flex 内置的函数支持如下: - -- count -- max -- min -- avg -- sum -- year -- month -- day -- convert -- concat +目前,MyBatis-Flex 基本支持所有 SQL +函数,查看已支持的 [所有函数](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/const/FuncName.java)。 更多的函数,用户可以参考 [QueryMethods](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java) ,然后再自己的项目里进行自定义扩展。