跳到主要内容

6.7.2 基础类型处理器

内置处理器位于 net.hasor.dataql.sqlproc.types 的子包中。常规映射自动生效,按需处理器通过 typeHandler 或应用注册启用。

字符串​

处理器JDBC 类型脚本结果
string.StringTypeHandlerCHAR、VARCHAR、LONGVARCHAR完整字符串
string.NStringTypeHandlerNCHAR、NVARCHAR、LONGNVARCHARUnicode 字符串
string.ClobAsStringTypeHandlerCLOB完整文本
string.NClobAsStringTypeHandlerNCLOB完整 Unicode 文本
string.SqlXmlTypeHandlerSQLXMLXML 文本

CHAR、NCHAR 读取完整字段,定长字段的补空格行为由数据库决定。SQL NULL 返回 null,空字符串是否保留由数据库决定。

var query = @@selectSql(text)<%
SELECT CAST(#{text, jdbcType=NCHAR} AS NCHAR(4))
%>;
return query('中文测试');

H2 返回 "中文测试"。CLOB、NCLOB 和 SQLXML 都在查询结束前读取完整内容,不会向脚本暴露 JDBC Reader。

数值与布尔值​

处理器默认 JDBC 类型说明
bool.BooleanTypeHandlerBIT、BOOLEAN布尔值
number.ByteTypeHandler / ShortTypeHandlerTINYINT、SMALLINT小整数
number.IntegerTypeHandler / LongTypeHandlerINTEGER、BIGINT整数
number.FloatTypeHandler / DoubleTypeHandlerFLOAT、REAL / DOUBLE浮点数
number.BigDecimalTypeHandlerNUMERIC、DECIMAL十进制数
number.BigIntegerTypeHandler大整数参数通过 BigDecimal 绑定
number.NumberTypeHandler其他 Number 参数通过 BigDecimal 绑定

数值读取时检查 SQL NULL,不会把空值误当成 0 或 false。数据库列的精度和范围决定最终存储能力。

var query = @@selectSql(amount, enabled)<%
SELECT CAST(#{amount} AS DECIMAL(12, 2)) AS "amount",
CAST(#{enabled, jdbcType=BOOLEAN} AS BOOLEAN) AS "enabled"
%>;
return query(123.45, true);

H2 返回 {"amount":123.45,"enabled":true}。

以下处理器需按需指定:

  • number.IntegerAsBooleanTypeHandler:将布尔值写为 1/0,读取整数时将非零视为 true。
  • number.StringAsBigIntegerTypeHandler、number.StringAsBigDecimalTypeHandler:以字符串形式存大数,读取后还原为大数;非空写入值分别为 BigInteger、BigDecimal。
  • number.PgMoneyAsBigDecimalTypeHandler:PostgreSQL money 文本与 BigDecimal 转换;金额文本格式受数据库区域设置影响。
var query = @@selectSql(enabled)<%
SELECT CAST(#{enabled, typeHandler=net.hasor.dataql.sqlproc.types.number.IntegerAsBooleanTypeHandler} AS INTEGER)
%>;
return query(true);

返回 1。参数处理器只改变写入;该结果列仍按 INTEGER 读取。

日期与时间​

jdbcType参数值脚本结果
DATE毫秒时间戳、yyyy-MM-dd 文本毫秒时间戳
TIME毫秒时间戳、HH:mm:ss 文本毫秒时间戳
TIMESTAMP毫秒时间戳、yyyy-MM-dd HH:mm:ss[.小数] 文本毫秒时间戳
TIME_WITH_TIMEZONE毫秒时间戳、12:34:56+08:00带偏移量的 ISO 文本
TIMESTAMP_WITH_TIMEZONE毫秒时间戳、2026-10-05T12:34:56+08:00带偏移量的 ISO 文本

DATE、TIME、TIMESTAMP 分别使用 time.SqlDateTypeHandler、time.SqlTimeTypeHandler、time.SqlTimestampTypeHandler;带时区类型使用 time.OffsetTimeTypeHandler 和 time.OffsetDateTimeTypeHandler。

时间戳处理器也接受文本中的 T 分隔符。不带时区的日期时间使用 JDBC 和应用本地时区语义;带时区处理器将数字按 UTC 时间点处理。DataQL 日期结果精度为毫秒,不保留 JDBC Timestamp 的额外纳秒位。

var query = @@selectSql(createdAt)<%
SELECT CAST(#{createdAt, jdbcType=TIMESTAMP_WITH_TIMEZONE} AS TIMESTAMP WITH TIME ZONE)
%>;
return query('2026-10-05T12:34:56+08:00');

H2 返回 "2026-10-05T12:34:56+08:00"。SQL NULL 返回 null,无法解析的日期文本使查询失败。

time.PgDateTypeHandler 是按需使用的 PostgreSQL 日期处理器,接受 ISO 日期字符串,支持公元前年份转换,读取结果也为 ISO 字符串。它不会自动替换常规 DATE 处理器。

XML 文本​

SQLXML 列使用 SqlXmlTypeHandler,写入时通过 JDBC 创建 SQLXML,读取为字符串并释放 SQLXML 资源:

var save = @@insertSql(xml)<%
INSERT INTO documents(xml_content)
VALUES (#{xml, jdbcType=SQLXML})
%>;
return save('<person><name>Alice</name></person>');

此例要求数据库和驱动支持 SQLXML,且 documents.xml_content 已建为对应类型。若使用普通文本列,直接按字符串存储即可。