diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml
new file mode 100644
index 0000000..a047676
--- /dev/null
+++ b/.github/workflows/github-release.yml
@@ -0,0 +1,35 @@
+name: publish github release
+
+on:
+ workflow_dispatch:
+ inputs:
+ releaseversion:
+ description: 'Release version'
+ required: true
+ default: '0.3.0'
+
+
+jobs:
+ publish-github-release:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Generate changelog
+ id: changelog
+ uses: metcalfc/changelog-generator@v4.3.1
+ with:
+ myToken: ${{ secrets.GH_TOKEN }}
+
+ - name: Create GitHub Release
+ id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
+ with:
+ tag_name: ${{ github.event.inputs.releaseversion }}
+ release_name: ${{ github.event.inputs.releaseversion }}
+ body: |
+ ### Things that changed in this release
+ ${{ steps.changelog.outputs.changelog }}
+ draft: false
+ prerelease: ${{ contains(github.event.inputs.releaseversion, '-') }}
diff --git a/.github/workflows/oss-release-deploy.yml b/.github/workflows/oss-release-deploy.yml
deleted file mode 100644
index 85d1b55..0000000
--- a/.github/workflows/oss-release-deploy.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: publish SNAPSHOT maven package
-on:
- workflow_dispatch:
- push:
- branches: [ release ]
-
-jobs:
- oss-release-deploy:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Set up JDK 8
- uses: actions/setup-java@v2
- with:
- java-version: '8'
- distribution: 'adopt'
- cache: maven
-
- - name: Setup Maven Central
- uses: actions/setup-java@v3
- with: # overwrite settings.xml
- java-version: '8'
- distribution: 'adopt'
- server-id: sonatype
- server-username: OSSRH_USERNAME
- server-password: OSSRH_PASSWORD
- gpg-private-key: ${{ secrets.MAVEN_GPG_KEY }}
- gpg-passphrase: MAVEN_GPG_PASSPHRASE
-
- - name: Publish to Maven Central
- run: mvn clean deploy -P release -Dmaven.test.skip=true
- env:
- MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
- OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
- OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
diff --git a/.github/workflows/oss-snapshot-deploy.yml b/.github/workflows/oss-snapshot-deploy.yml
deleted file mode 100644
index fc60c5f..0000000
--- a/.github/workflows/oss-snapshot-deploy.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: publish SNAPSHOT maven package
-on:
- workflow_dispatch:
- push:
- branches: [ master ]
-
-jobs:
- oss-snapshot-deploy:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Set up JDK 17
- uses: actions/setup-java@v2
- with:
- java-version: '17'
- distribution: 'adopt'
- cache: maven
-
- - name: Setup Maven Central
- uses: actions/setup-java@v3
- with: # overwrite settings.xml
- java-version: '8'
- distribution: 'adopt'
- server-id: sonatype
- server-username: OSSRH_USERNAME
- server-password: OSSRH_PASSWORD
- gpg-private-key: ${{ secrets.MAVEN_GPG_KEY }}
- gpg-passphrase: MAVEN_GPG_PASSPHRASE
-
- - name: Publish to Maven Central
- run: mvn clean deploy -P snapshot -Dmaven.test.skip=true
- env:
- MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
- OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
- OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
diff --git a/README.md b/README.md
index bb4008d..c72c92d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
-Nacos 从 2.2.0 版本开始,可通过 SPI 机制注入多数据源实现插件,并在引入对应数据源实现后,便可在 Nacos 启动时通过读取 application.properties 配置文件中 spring.datasource.platform 配置项选择加载对应多数据源插件.
+Nacos 从 2.2.0 版本开始,可通过 SPI 机制注入多数据源实现插件,并在引入对应数据源实现后,便可在 Nacos 启动时通过读取
+application.properties 配置文件中 spring.datasource.platform 配置项选择加载对应多数据源插件.
![Nacos 插件化实现
](https://minio.pigx.top/oss/202212/1671179590.jpg)
@@ -13,27 +14,34 @@ Nacos 从 2.2.0 版本开始,可通过 SPI 机制注入多数据源实现插件,
> 依赖已上传 maven 中央仓库,请勿使用阿里云代理
+| NACOS 版本 | 插件版本 |
+|---------------|-------|
+| 2.2.0 - 2.3.0 | 0.2.0 |
+| 2.3.1 - 2.3.2 | 0.3.0 |
```xml
com.pig4cloud.plugin
nacos-datasource-plugin-dm8
- 0.0.2
+ ${VERSION}
- com.dameng
- DmJdbcDriver18
- 8.1.1.193
+com.dameng
+DmJdbcDriver18
+8.1.1.193
```
-## 2.导入 nacos dm8 数据库脚本
-在达梦数据库管理工具上创建名为 `nacos` 的表空间,导入一下数据库脚本
-[数据库脚本](./sql/nacos.sql)
+## 2. 使用达梦DTS迁移工具
+
+达梦DTS能够支持将Nacos原版的MYSQL数据库迁移至支持达梦数据库的脚本。
+
+
## 3.配置 nacos 数据源链接信息
+
```
db:
num: 1
@@ -46,8 +54,8 @@ db:
driver-class-name: dm.jdbc.driver.DmDriver
```
-
## 4.执行数据库平台
+
```
spring:
datasource:
diff --git a/pom.xml b/pom.xml
index 6fd856c..e6637ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
4.0.0
com.pig4cloud.plugin
nacos-datasource-plugin-dm8
- 0.0.2
+ 0.0.3
nacos-datasource-plugin-dm8
nacos-datasource-plugin-dm8
https://pig4cloud.com
@@ -25,7 +25,7 @@
- 2.2.4
+ 2.3.2
0.0.32
3.8.1
1.8
diff --git a/sql/nacos.sql b/sql/nacos.sql
deleted file mode 100644
index cb7baa3..0000000
--- a/sql/nacos.sql
+++ /dev/null
@@ -1,198 +0,0 @@
-CREATE TABLE "CONFIG_INFO"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(255 CHAR),
- "CONTENT" TEXT NOT NULL,
- "MD5" NVARCHAR2(32 CHAR),
- "GMT_CREATE" DATE DEFAULT SYSDATE() NOT NULL,
- "GMT_MODIFIED" DATE DEFAULT SYSDATE() NOT NULL,
- "SRC_USER" TEXT,
- "SRC_IP" NVARCHAR2(50 CHAR),
- "APP_NAME" NVARCHAR2(128 CHAR),
- "TENANT_ID" NVARCHAR2(128 CHAR) DEFAULT '',
- "C_DESC" NVARCHAR2(256 CHAR),
- "C_USE" NVARCHAR2(64 CHAR),
- "EFFECT" NVARCHAR2(64 CHAR),
- "TYPE" NVARCHAR2(64 CHAR),
- "C_SCHEMA" TEXT,
- "ENCRYPTED_DATA_KEY" TEXT NOT NULL,
- NOT CLUSTER PRIMARY KEY("ID"),
- UNIQUE("DATA_ID", "GROUP_ID", "TENANT_ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "CONFIG_INFO_AGGR"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "DATUM_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "CONTENT" TEXT NOT NULL,
- "GMT_MODIFIED" DATE NOT NULL,
- "APP_NAME" NVARCHAR2(128 CHAR),
- "TENANT_ID" NVARCHAR2(128 CHAR),
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "CONFIG_INFO_BETA"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "APP_NAME" NVARCHAR2(128 CHAR),
- "CONTENT" TEXT NOT NULL,
- "BETA_IPS" TEXT,
- "MD5" NVARCHAR2(32 CHAR),
- "GMT_CREATE" DATE NOT NULL,
- "GMT_MODIFIED" DATE NOT NULL,
- "SRC_USER" TEXT,
- "SRC_IP" NVARCHAR2(50 CHAR),
- "TENANT_ID" NVARCHAR2(128 CHAR),
- "ENCRYPTED_DATA_KEY" TEXT NOT NULL,
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "CONFIG_INFO_TAG"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "TENANT_ID" NVARCHAR2(128 CHAR),
- "TAG_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "APP_NAME" NVARCHAR2(128 CHAR),
- "CONTENT" TEXT NOT NULL,
- "MD5" NVARCHAR2(32 CHAR),
- "GMT_CREATE" DATE NOT NULL,
- "GMT_MODIFIED" DATE NOT NULL,
- "SRC_USER" TEXT,
- "SRC_IP" NVARCHAR2(50 CHAR),
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "CONFIG_TAGS_RELATION"
-(
- "ID" NUMBER(20,0) NOT NULL,
- "TAG_NAME" NVARCHAR2(128 CHAR) NOT NULL,
- "TAG_TYPE" NVARCHAR2(64 CHAR),
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "TENANT_ID" NVARCHAR2(128 CHAR),
- "NID" INT IDENTITY(1, 1) NOT NULL,
- NOT CLUSTER PRIMARY KEY("NID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "GROUP_CAPACITY"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "GROUP_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "QUOTA" NUMBER(11,0) NOT NULL,
- "USAGE" NUMBER(11,0) NOT NULL,
- "MAX_SIZE" NUMBER(11,0) NOT NULL,
- "MAX_AGGR_COUNT" NUMBER(11,0) NOT NULL,
- "MAX_AGGR_SIZE" NUMBER(11,0) NOT NULL,
- "MAX_HISTORY_COUNT" NUMBER(11,0) NOT NULL,
- "GMT_CREATE" DATE NOT NULL,
- "GMT_MODIFIED" DATE NOT NULL,
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-COMMENT ON TABLE "GROUP_CAPACITY" IS '集群、各Group容量信息表';
-COMMENT ON COLUMN "GROUP_CAPACITY"."ID" IS '主键ID';
-COMMENT ON COLUMN "GROUP_CAPACITY"."GROUP_ID" IS 'Group ID,空字符表示整个集群';
-COMMENT ON COLUMN "GROUP_CAPACITY"."QUOTA" IS '配额,0表示使用默认值';
-COMMENT ON COLUMN "GROUP_CAPACITY"."USAGE" IS '使用量';
-COMMENT ON COLUMN "GROUP_CAPACITY"."MAX_SIZE" IS '单个配置大小上限,单位为字节,0表示使用默认值';
-COMMENT ON COLUMN "GROUP_CAPACITY"."MAX_AGGR_COUNT" IS '聚合子配置最大个数,,0表示使用默认值';
-COMMENT ON COLUMN "GROUP_CAPACITY"."MAX_AGGR_SIZE" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
-COMMENT ON COLUMN "GROUP_CAPACITY"."MAX_HISTORY_COUNT" IS '最大变更历史数量';
-COMMENT ON COLUMN "GROUP_CAPACITY"."GMT_CREATE" IS '创建时间';
-COMMENT ON COLUMN "GROUP_CAPACITY"."GMT_MODIFIED" IS '修改时间';
-
-
-CREATE TABLE "HIS_CONFIG_INFO"
-(
- "ID" INT NOT NULL,
- "NID" INT IDENTITY(1, 1) NOT NULL,
- "DATA_ID" NVARCHAR2(255 CHAR) NOT NULL,
- "GROUP_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "APP_NAME" NVARCHAR2(128 CHAR),
- "CONTENT" TEXT NOT NULL,
- "MD5" NVARCHAR2(32 CHAR),
- "GMT_CREATE" DATE DEFAULT SYSDATE() NOT NULL,
- "GMT_MODIFIED" DATE DEFAULT SYSDATE() NOT NULL,
- "SRC_USER" TEXT,
- "SRC_IP" NVARCHAR2(50 CHAR),
- "OP_TYPE" NCHAR(10),
- "TENANT_ID" NVARCHAR2(128 CHAR),
- "ENCRYPTED_DATA_KEY" TEXT NOT NULL,
- NOT CLUSTER PRIMARY KEY("NID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-COMMENT ON TABLE "HIS_CONFIG_INFO" IS '多租户改造';
-COMMENT ON COLUMN "HIS_CONFIG_INFO"."APP_NAME" IS 'app_name';
-COMMENT ON COLUMN "HIS_CONFIG_INFO"."TENANT_ID" IS '租户字段';
-COMMENT ON COLUMN "HIS_CONFIG_INFO"."ENCRYPTED_DATA_KEY" IS '秘钥';
-
-
-CREATE TABLE "PERMISSIONS"
-(
- "ROLE" NVARCHAR2(50 CHAR) NOT NULL,
- "RESOURCE" NVARCHAR2(255 CHAR) NOT NULL,
- "ACTION" NVARCHAR2(8 CHAR) NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "ROLES"
-(
- "USERNAME" NVARCHAR2(50 CHAR) NOT NULL,
- "ROLE" NVARCHAR2(50 CHAR) NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-CREATE TABLE "TENANT_CAPACITY"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "TENANT_ID" NVARCHAR2(128 CHAR) NOT NULL,
- "QUOTA" NUMBER(11,0) NOT NULL,
- "USAGE" NUMBER(11,0) NOT NULL,
- "MAX_SIZE" NUMBER(11,0) NOT NULL,
- "MAX_AGGR_COUNT" NUMBER(11,0) NOT NULL,
- "MAX_AGGR_SIZE" NUMBER(11,0) NOT NULL,
- "MAX_HISTORY_COUNT" NUMBER(11,0) NOT NULL,
- "GMT_CREATE" DATE NOT NULL,
- "GMT_MODIFIED" DATE NOT NULL,
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-COMMENT ON TABLE "TENANT_CAPACITY" IS '租户容量信息表';
-COMMENT ON COLUMN "TENANT_CAPACITY"."ID" IS '主键ID';
-COMMENT ON COLUMN "TENANT_CAPACITY"."TENANT_ID" IS 'Tenant ID';
-COMMENT ON COLUMN "TENANT_CAPACITY"."QUOTA" IS '配额,0表示使用默认值';
-COMMENT ON COLUMN "TENANT_CAPACITY"."USAGE" IS '使用量';
-COMMENT ON COLUMN "TENANT_CAPACITY"."MAX_SIZE" IS '单个配置大小上限,单位为字节,0表示使用默认值';
-COMMENT ON COLUMN "TENANT_CAPACITY"."MAX_AGGR_COUNT" IS '聚合子配置最大个数';
-COMMENT ON COLUMN "TENANT_CAPACITY"."MAX_AGGR_SIZE" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
-COMMENT ON COLUMN "TENANT_CAPACITY"."MAX_HISTORY_COUNT" IS '最大变更历史数量';
-COMMENT ON COLUMN "TENANT_CAPACITY"."GMT_CREATE" IS '创建时间';
-COMMENT ON COLUMN "TENANT_CAPACITY"."GMT_MODIFIED" IS '修改时间';
-
-
-CREATE TABLE "TENANT_INFO"
-(
- "ID" INT IDENTITY(1, 1) NOT NULL,
- "KP" NVARCHAR2(128 CHAR) NOT NULL,
- "TENANT_ID" NVARCHAR2(128 CHAR),
- "TENANT_NAME" NVARCHAR2(128 CHAR),
- "TENANT_DESC" NVARCHAR2(256 CHAR),
- "CREATE_SOURCE" NVARCHAR2(32 CHAR),
- "GMT_CREATE" NUMBER(20,0) NOT NULL,
- "GMT_MODIFIED" NUMBER(20,0) NOT NULL,
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-COMMENT ON TABLE "TENANT_INFO" IS 'tenant_info';
-COMMENT ON COLUMN "TENANT_INFO"."ID" IS 'id';
-COMMENT ON COLUMN "TENANT_INFO"."KP" IS 'kp';
-COMMENT ON COLUMN "TENANT_INFO"."TENANT_ID" IS 'tenant_id';
-COMMENT ON COLUMN "TENANT_INFO"."TENANT_NAME" IS 'tenant_name';
-COMMENT ON COLUMN "TENANT_INFO"."TENANT_DESC" IS 'tenant_desc';
-COMMENT ON COLUMN "TENANT_INFO"."CREATE_SOURCE" IS 'create_source';
-COMMENT ON COLUMN "TENANT_INFO"."GMT_CREATE" IS '创建时间';
-COMMENT ON COLUMN "TENANT_INFO"."GMT_MODIFIED" IS '修改时间';
-
-
-CREATE TABLE "USERS"
-(
- "USERNAME" NVARCHAR2(50 CHAR) NOT NULL,
- "PASSWORD" NVARCHAR2(500 CHAR) NOT NULL,
- "ENABLED" NUMBER(4,0) NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR) ;
-
-INSERT INTO USERS(USERNAME, PASSWORD, ENABLED) VALUES ( 'nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);
-INSERT INTO ROLES(USERNAME,ROLE) VALUES ( 'nacos', 'ROLE_ADMIN');
diff --git a/src/main/java/com/pig4cloud/plugin/impl/dm/ConfigInfoAggrMapperByDm.java b/src/main/java/com/pig4cloud/plugin/impl/dm/ConfigInfoAggrMapperByDm.java
index 049ea0e..4b25b23 100644
--- a/src/main/java/com/pig4cloud/plugin/impl/dm/ConfigInfoAggrMapperByDm.java
+++ b/src/main/java/com/pig4cloud/plugin/impl/dm/ConfigInfoAggrMapperByDm.java
@@ -1,65 +1,29 @@
package com.pig4cloud.plugin.impl.dm;
-import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.alibaba.nacos.plugin.datasource.constants.FieldConstant;
+import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoAggrMapper;
+import com.alibaba.nacos.plugin.datasource.model.MapperContext;
+import com.alibaba.nacos.plugin.datasource.model.MapperResult;
import com.pig4cloud.plugin.constants.DataSourceConstant;
import java.util.List;
-public class ConfigInfoAggrMapperByDm extends DmAbstractMapper implements ConfigInfoAggrMapper {
-
- public String batchRemoveAggr(List datumList) {
- final StringBuilder datumString = new StringBuilder();
- for (String datum : datumList) {
- datumString.append('\'').append(datum).append("',");
- }
- datumString.deleteCharAt(datumString.length() - 1);
- return "DELETE FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND (tenant_id = ? OR tenant_id IS NULL) AND datum_id IN ("
- + datumString + ")";
- }
+public class ConfigInfoAggrMapperByDm extends AbstractMapper implements ConfigInfoAggrMapper {
@Override
- public String aggrConfigInfoCount(int size, boolean isIn) {
- StringBuilder sql = new StringBuilder(
- "SELECT count(*) FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND (tenant_id = ? OR tenant_id IS NULL) AND datum_id");
- if (isIn) {
- sql.append(" IN (");
- }
- else {
- sql.append(" NOT IN (");
- }
- for (int i = 0; i < size; i++) {
- if (i > 0) {
- sql.append(", ");
- }
- sql.append('?');
- }
- sql.append(')');
-
- return sql.toString();
- }
-
- @Override
- public String findConfigInfoAggrIsOrdered() {
- return "SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM "
- + "config_info_aggr WHERE data_id = ? AND group_id = ? AND (tenant_id = ? OR tenant_id IS NULL) ORDER BY datum_id";
- }
+ public MapperResult findConfigInfoAggrByPageFetchRows(MapperContext context) {
+ int startRow = context.getStartRow();
+ int pageSize = context.getPageSize();
+ String dataId = (String) context.getWhereParameter(FieldConstant.DATA_ID);
+ String groupId = (String) context.getWhereParameter(FieldConstant.GROUP_ID);
+ String tenantId = (String) context.getWhereParameter(FieldConstant.TENANT_ID);
- @Override
- public String findConfigInfoAggrByPageFetchRows(int startRow, int pageSize) {
String sql = "SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM config_info_aggr WHERE data_id= ? AND "
- + "group_id= ? AND (tenant_id= ? OR tenant_id IS NULL) ORDER BY datum_id";
- return buildPaginationSql(sql, startRow, pageSize);
- }
-
- @Override
- public String findAllAggrGroupByDistinct() {
- return "SELECT DISTINCT data_id, group_id, tenant_id FROM config_info_aggr";
- }
-
- @Override
- public String getTableName() {
- return TableConstant.CONFIG_INFO_AGGR;
+ + "group_id= ? AND tenant_id= ? ORDER BY datum_id LIMIT " + startRow + "," + pageSize;
+ List