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"
成功:
{ "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.进行总结
官网是解决问题最好的资料,但是不少官网的说明文档都差点儿意思,最终还是要对问题进行分析,多看报错信息,报错信息不明朗的,就要对源码进行分析了。