如何通过jOOQ动态API从表值函数中查询数据?
用jOOQ动态API调用表值函数的正确方式
当然可以用jOOQ动态API生成以表值函数为数据源的查询,你之前的写法不对是因为DSL.function()生成的是标量函数调用,而表值函数属于表表达式,得用DSL.table()来包装函数调用,转换成jOOQ能识别的Table类型。
基础用法示例
假设你要调用的表值函数是get_users(int user_id),参数为123,正确的写法如下:
// 生成 SELECT * FROM get_users(123) DSL.select(DSL.asterisk()) .from(DSL.table(DSL.function("get_users", SQLDataType.RECORD, DSL.val(123)))) .fetch();
给表值函数结果起别名并引用列
如果需要给表值函数的结果集起别名,或者精准引用返回的列,可以用.as()方法:
Table<?> userTable = DSL.table(DSL.function("get_users", SQLDataType.RECORD, DSL.val(123))).as("u"); // 生成 SELECT u.name, u.age FROM get_users(123) u DSL.select(userTable.field("name"), userTable.field("age")) .from(userTable) .fetch();
强类型处理表值函数返回结果
要是你明确知道表值函数的返回结构,可以自定义RecordType实现强类型调用,避免硬编码列名:
// 定义表值函数返回的记录结构 RecordType<UserRecord> userRecordType = DSL.recordType( DSL.field("id", SQLDataType.INTEGER), DSL.field("name", SQLDataType.VARCHAR), DSL.field("age", SQLDataType.INTEGER) ); // 包装成强类型Table Table<UserRecord> userTable = DSL.table(DSL.function("get_users", userRecordType, DSL.val(123))).as("u"); // 强类型引用列并映射到实体类 DSL.select(userTable.field(UserRecord::getName), userTable.field(UserRecord::getAge)) .from(userTable) .fetchInto(User.class);
补充说明
jOOQ文档里提到的代码生成器方式,是通过提前生成表值函数的对应类,让你像调用普通表一样使用,但动态API下就用上述DSL.table()包装函数调用的方式即可,不需要依赖代码生成。
内容的提问来源于stack exchange,提问作者Gavin Ray
相关产品推荐
相关产品推荐

