Dataway接口配置服务使用DataQL聚合查询引擎
1.报错说明
在本地搭建了两个平台,hasor核心依赖的版本是一致的, 连接的都是GreenPlum数据库 ,且执行的是相同的DataQL语句:
<!--hasor核心依赖【是老平台接入,由于兼容问题,最终用的并不是最新的4.2.5版本】-->
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.2.1</version>
</dependency>
以下是执行的DataQL:
// SQL 执行器切换为分页模式及首页页面设置
hint FRAGMENT_SQL_QUERY_BY_PAGE = true
hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1
// 定义查询SQL
var query = @@sql() <%
select \* from yz_test_match
%>
// 创建分页查询对象
var pageQuery = query(${pageSize},${pageNumber});
// 设置分页信息
run pageQuery.setPageInfo({
"pageSize" : #{pageSize},
"currentPage" : #{pageNumber}
});
// 执行分页查询
var result = pageQuery.data();
// 查询分页信息
//var result = pageQuery.pageInfo();
return result;
为什么说是两个平台,不同的地方是配置文件:
# 报错配置【使用的是GreenplumDriver】【这个是要集成项目的配置信息】
spring:
application:
name: dataWay-demo
datasource:
url: jdbc:pivotal:greenplum://xxx.xx.xxx.xxx:2345;DatabaseName=gpdb
username: gpadmin
password: gpadmin
driver-class-name: com.pivotal.jdbc.GreenplumDriver
type: com.alibaba.druid.pool.DruidDataSource
# 未报错配置【使用的是P6SpyDriver和postgresql的组合】
spring:
application:
name: dataWay-demo
datasource:
url: jdbc:p6spy:postgresql://xxx.xx.xxx.xxx:2345/gpdb
username: gpadmin
password: gpadmin
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
type: com.alibaba.druid.pool.DruidDataSource
报错信息【省略了一部分不必要信息】:
2021-07-23 15:15:26.877 ERROR 9904 --- [nio-8088-exec-1] n.hasor.dataway.service.ApiCallService : [line 9:17~11:2 ,QIL 1:6] Query dialect missing.
net.hasor.dataql.runtime.InstructRuntimeException: [line 9:17~11:2 ,QIL 1:6] Query dialect missing.
Caused by: java.lang.IllegalArgumentException: Query dialect missing.
2.原因分析
由于是老项目集成 Hasor,项目用的是 greenplum 驱动,官网是这样描述执行器使用的方言的【在 4.2.1 版本之后,SQL 执行器会根据使用的数据库连接自动推断对应的方言】,而 Hasor 并未支持 greenplum 数据库方言,但是却支持PostgreSQL,GP数据库是从PG数据库演变而来
,所以考虑使用 FRAGMENT_SQL_PAGE_DIALECT来配置一下:
3.问题解决
根据官网描述DataQL添加了设置方言的语句:
hint FRAGMENT_SQL_PAGE_DIALECT = postgresql
报错:
{
"success": false,
"message": "line 2:33 mismatched input 'postgresql' expecting {'true', 'false', 'null', STRING, HEX\_NUM, OCT\_NUM, BIT\_NUM, INTEGER\_NUM, DECIMAL\_NUM}",
"code": 500,
"lifeCycleTime": 5,
"executionTime": -1,
"value": "line 2:33 mismatched input 'postgresql' expecting {'true', 'false', 'null', STRING, HEX\_NUM, OCT\_NUM, BIT\_NUM, INTEGER\_NUM, DECIMAL\_NUM}"
}
expecting STRING格式【修改之后又测试】:
hint FRAGMENT_SQL_PAGE_DIALECT = "postgresql"
成功: