跳到主要内容

代码片段

在查询中将其它语言片段直接写在 DataQL 中并作为函数来使用,这个能力在 DataQL 被称作:代码片段

注:在 DataQL 中混合其它语言一起协同处理 DataQL 查询,需要定义一个片段执行器

一个典型的场景是把 SQL 语句混合在 DataQL 查询中,利用 DataQL 对 SQL 的查询结果进行二次加工。

例如
var dataSet = @@sql(item_code) <%
select * from category where co_code = #{item_code}
%>

return dataSet() => [
{ "id","name","code","body" }
]

@@sql 是 FunctionX 扩展包中提供的一组片段执行器,这个片段执行器相当于让 DataQL 有能力执行数据库的 SQL 语句。

定义

定义一个片段执行器需要,实现 net.hasor.dataql.FragmentProcess 接口(更多信息请参考开发手册)并且将其注册到 DataQL 环境中:

方式一:通过 DataQL 接口
FragmentProcess process = ...
AppContext = appContext = ...

DataQL dataQL = appContext.getInstance(DataQL.class);//获取 DataQL 接口
dataQL.addFragmentProcess("sql", process); //注册片段执行器
方式二:通过 QueryModule
FragmentProcess process = ...

public class MyQueryModule implements QueryModule {
public void loadModule(QueryApiBinder apiBinder) {
dataQL.addFragmentProcess("sql", process); //注册片段执行器
}
}

使用

定义一个片段执行器需要使用 @@xxxx(arg1,arg2,arg3,...)<% ..... %> 语法,其中:

  • xxxx 为片段执行器注册到名称。
  • (arg1,arg2,arg3,...) 为执行这个代码时传入的参数列表。如果不需要定义任何参数可以是 ()
  • <%%> 之间编写的是 目标语言的代码片段。

比如在 MySQL 中插入一条数据,并返回自增的ID:

var saveData = @@sql(data) <%
insert into my_option (
`key`,
`value`,
`desc`
) values (
#{data.key},
#{data.value},
#{data.desc}
);
select LAST_INSERT_ID();
%>
return saveData(${root});