跳到主要内容

8.1 独立使用

引入 dataql-engine 即可在 Java 应用中编译和执行查询,入门示例见概览。应用负责提供输入数据并处理查询结果。

执行参数​

Query.execute(...) 支持以下方式:

调用方式脚本取值
execute()不提供参数
execute(Map<String, ?>)按键名读取,如 ${name}
execute(Object[])按位置读取,如 ${_0}、${_1}
execute(CustomizeScope)分别提供 $、@、# 三组参数

直接调用 execute(Map) 时,${name}、@{name}、#{name} 读取同一份 Map。需要区分三组数据时,使用 CustomizeScope。Dataway 的默认值合并和请求参数包装由上层实现,见自定义作用域。

编译与复用​

createQuery(String) 会立即编译脚本。需要复用编译结果时,先取得 QIL,再为各次调用创建查询:

CompiledQueryExample.java
import java.util.Map;
import net.hasor.dataql.compiler.qil.QIL;
import net.hasor.dataql.host.HostConfiguration;
import net.hasor.dataql.host.Query;
import net.hasor.dataql.host.QueryBuilder;
import net.hasor.dataql.host.QueryManager;

public class CompiledQueryExample {
public static void main(String[] args) throws Exception {
QueryManager manager = new QueryManager(new HostConfiguration());
QueryBuilder builder = manager.newBuilder();
QIL compiled = builder.compilerQuery("return ${price} * ${count};");

Query first = builder.createQuery(compiled);
System.out.println(first.execute(Map.of("price", 10, "count", 2)).getData().unwrap());

Query second = builder.createQuery(compiled);
System.out.println(second.execute(Map.of("price", 10, "count", 3)).getData().unwrap());
}
}

输出为 20、30,两次查询复用 QIL,各自接收参数。QueryManager 负责创建构建器,编译缓存由应用自行管理。

QueryBuilder 还支持从 Reader、InputStream 读取脚本;流的默认字符集为 UTF-8,也可显式指定。需要检查或修改语法树时,使用 parserQuery(...) 获取 QueryModel,再通过 compilerQuery(model) 编译。

结果与异常​

execute(...) 返回 QueryResult:

方法含义
getData().unwrap()将脚本结果转为 Java 对象
getCode()脚本结果码,默认 0
getExitType() / isExit()区分 return 和 exit
executionTime()查询执行耗时

语法解析、编译和运行阶段均可能抛出异常;运行阶段通过 QueryRuntimeException 提供错误位置等信息。引擎不生成 HTTP 响应,返回格式和异常响应由调用方处理。

HostConfiguration 可在配置完成后复用。QueryBuilder、Query 包含可变配置,应用应避免在并发执行时修改共享变量和 Hint。