跳到主要内容

6.5 结果与主键

查询先将每行转换为按列标签组织的对象,再根据拆包选项返回列表、对象或单值。插入、更新和删除返回影响行数。

查询结果​

查询结果offrowcolumn(默认)
没有记录[]{}null
一行一列对象列表对象单值
一行多列对象列表对象对象
多行对象列表对象列表对象列表
hint FRAGMENT_SQL_OPEN_PACKAGE = 'off';
hint FRAGMENT_SQL_COLUMN_CASE = 'lower';
var find = @@selectSql(id)<%
SELECT id, name FROM people WHERE id = #{id}
%>;
return find(1);

使用 people 示例表,返回 [{"id":1,"name":"Alice"}]。将 off 改为 row,返回 {"id":1,"name":"Alice"};改为 column 时,这个两列查询仍返回对象。

单列查询可以直接取值:

hint FRAGMENT_SQL_OPEN_PACKAGE = 'column';
var find = @@selectSql(id)<% SELECT name FROM people WHERE id = #{id} %>;
return find(1);

返回 Alice;传入不存在的 ID 时返回 null。

需要稳定的列表结构时使用 off。分页的 data() 始终返回当前页列表。

列名转换​

FRAGMENT_SQL_COLUMN_CASE 支持 default、upper、lower、hump。默认保留驱动列标签,hump 将下划线转为小驼峰。

hint FRAGMENT_SQL_OPEN_PACKAGE = 'off';
hint FRAGMENT_SQL_COLUMN_CASE = 'hump';
var find = @@selectSql()<% SELECT id AS user_id, name AS user_name FROM people ORDER BY id %>;
return find();

结果中的字段为 userId、userName。SQL 别名优先于原列名;转换后重名的列保留首次出现的值,应通过别名消除冲突。

主键查询​

insertXml 可用 selectKey 在插入前或后执行查询,将查询结果写入片段参数。下面使用 H2 序列生成主键:

CREATE SEQUENCE people_ids START WITH 100;
var add = @@insertXml(name, age)<%
<selectKey keyProperty="newId" order="before">
SELECT NEXT VALUE FOR people_ids
</selectKey>
INSERT INTO people(id, name, age) VALUES (#{newId}, #{name}, #{age})
%>;
var find = @@selectSql(name)<% SELECT id FROM people WHERE name = #{name} %>;
run add('Carol', 20);
return find('Carol');

order="before" 先查询主键再插入,after 在插入后查询,两次语句使用同一连接。keyProperty 指定写入的参数;多字段结果可用 keyColumn 指定列名。insertXml 的返回值仍是影响行数,参数写回不会自动成为脚本的返回值。

当前 JDBC 执行链未接通 getGeneratedKeys()。useGeneratedKeys、keyProperty、keyColumn Hint 虽可解析,不能据此直接取回自增主键。需要主键时使用适合数据库的 selectKey 或明确的查询语句。

指定输出​

hint bindOut = '#result-set-1';
var find = @@selectSql()<% SELECT count(*) FROM people %>;
return find();

上述示例返回 {"#result-set-1":2};bindOut 保留所选输出的名称,具体结果值仍受拆包配置影响。

bindOut 可在查询及通用执行中选择指定结果名;存储过程输出和多结果编号见存储过程与多结果。分页不支持同时设置 bindOut。

选择结果处理方式​

  • 行列表、单对象、单值:设置 FRAGMENT_SQL_OPEN_PACKAGE。
  • 列名大小写和驼峰:设置 FRAGMENT_SQL_COLUMN_CASE,需要重命名的列直接使用 SQL 别名。
  • 日期、JSON、数组、二进制等字段转换:使用类型处理器。
  • 存储过程输出、多个结果集和更新计数:用 bindOut 选择命名输出,详见存储过程与多结果。
  • 对查询结果重新筛选、计算或组织层次:使用 DataQL 的结构转换。

这些配置作用于 SQL 执行结果。Dataway 的 HTTP 结果处理器在 API 返回阶段处理响应,属于另一层能力。SQL 执行器没有 resultSet、resultUpdate、defaultResult 动态规则。