PostgreSQL 函数 + 在 jOOQ 中强制转换

Posted

技术标签:

【中文标题】PostgreSQL 函数 + 在 jOOQ 中强制转换【英文标题】:PostgreSQL function + cast in jOOQ 【发布时间】:2014-12-06 17:28:34 【问题描述】:

这句话用jOOQ怎么表达?

SELECT version FROM abc ORDER BY string_to_array(version, '.', '')::int[] desc limit 1

我正在为函数和演员组合而苦苦挣扎。

【问题讨论】:

非常有趣的排序技术,顺便说一句...最后,PostgreSQL 中的数组用例 :-) 这是直接在数据库中对版本号进行排序。它是 Postgres,非常棒 :-) 是的,PostgreSQL 似乎增强了 SQL:2011 标准,该标准在 8.2 <comparison predicate>General Rules1) b) ii) 中指定未为数组定义 < 比较操作...我不过,想知道 PostgreSQL 是否会做出这样的保证……it seems to be the case yep, it is 【参考方案1】:

您有多种选择。

懒惰,将所有内容都包装在一个简单的 SQL 表达式中:

Field<Integer[]> f1 = 
    DSL.field("string_to_array(version, '.', '')::int[]", Integer[].class);

创建一个可重用的函数:

Field<Integer[]> stringToIntArray(Field<String> arg1, String arg2, String arg3) 
    return DSL.field("string_to_array(0, 1, 2)::int[]", Integer[].class,
        arg1, DSL.val(arg2), DSL.val(arg3));


// and then...
Field<Integer[]> f2 = stringToIntArray(ABC.VERSION, ".", "");

使用代码生成器生成内置函数,并显式转换:

Field<Integer[]> f3 = Routines.stringToArray(ABC.VERSION, DSL.val("."), DSL.val(""))
                              .cast(Integer[].class);

内置函数是postgres 数据库中pg_catalog 架构的一部分。

放在一起

DSL.using(configuration)
   .select(ABC.VERSION)
   .from(ABC)
   .orderBy(fN.desc()) // place any of f1, f2, f3 here
   .limit(1)
   .fetch();

【讨论】:

以上是关于PostgreSQL 函数 + 在 jOOQ 中强制转换的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ:比较 uuid(来自 postgresql)和字符串(类中的用户 id)

使用 jOOQ 在 PostgreSQL 中进行 UPSERT

jOOQ - 在查询中简洁地表示列和聚合/窗口函数

jOOQ 无法映射 PostgreSQL 列以使 JPA 满意

如何在 PostgreSql 上使用 Jooq 级联截断?

JOOQ快速上手(基于springboot 和 postgresql)