本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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}"
}
复制代码
我一看就笑了【修改之后又测试】:
hint FRAGMENT_SQL_PAGE_DIALECT = "postgresql"
复制代码
成功:
{
"success": true,
"message": "OK",
"code": 0,
"lifeCycleTime": 17,
"executionTime": 11,
"value": {
"firstrecommendfield": "豫K9F573",
"secondrecommendfield": "460010993506966",
"isusing": 1,
"futurestartdate": 1618934400000,
"handle": 1,
"possibility": 1,
"attribution": null,
"sourcetype": 0
}
}
复制代码
4.进行总结
官网是解决问题最好的资料,但是不少官网的说明文档都差点儿意思,最终还是要对问题进行分析,多看报错信息,报错信息不明朗的,就要对源码进行分析了。