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

Posted

技术标签:

【中文标题】jOOQ:比较 uuid(来自 postgresql)和字符串(类中的用户 id)【英文标题】:jOOQ : compare uuid(from postgresql) and string(user id in class) 【发布时间】:2014-11-30 17:28:12 【问题描述】:

我的后端是 postgresql。我正在尝试编写一个简单的函数来使用 jooq 记录从数据库中获取数据。这个表的 DAO 是我写的。我面临的问题是比较 db 中的 UUID 和提供给函数的字符串。

public Correspondence fetchByExternalId(String externalId) 
    CorrespondenceRecord correspondenceRecord =
            create.fetchOne(Tables.CORRESPONDENCE,
                    Tables.CORRESPONDENCE.USERID.eq(externalId));

CORRESPONDENCE.USERID 是 UUID,externalId 是字符串;运算符 eq 是我无法在此处实现的运算符,它在以前的场合对我有用。

显示的错误是: 无法解析方法 'eq(java.lang.String)'

当我提到 jOOQ site for help 时,它显示 'eq' 是它建议使用的运算符!

谁能帮我换个方法或告诉我哪里出错了?

【问题讨论】:

【参考方案1】:

jOOQ 是一个非常安全的 API,因此您无法使用 eq()UUID 类型与 String 类型进行比较,因为 eq() method 使用您的 CORRESPONDENCE.USERID 列的通用 <T> 类型,即UUID:

TableField<..., java.util.UUID> USERID = ...

在 Java 客户端中生成 UUID 绑定值

您必须以UUID 类型的形式提供externalId,例如:

CORRESPONDENCE.USERID.eq(UUID.fromString(externalId))

...或者,您让 jOOQ 为您转换该类型:

CORRESPONDENCE.USERID.eq(CORRESPONDENCE.USERID.getDataType().convert(externalId))

以上两者是等价的。

在数据库中生成 UUID 绑定值

您也始终可以通过强制转换将类型转换工作推迟到数据库中(这将导致 CAST(? AS UUID) 被渲染:

CORRESPONDENCE.USERID.eq(DSL.cast(externalId, UUID.class));

...或者通过强制变量遵守UUID 类型(相信数据库可以将VARCHAR 类型隐式转换为UUID 类型):

CORRESPONDENCE.USERID.eq(DSL.coerce(DSL.val(externalId), UUID.class));

【讨论】:

以上是关于jOOQ:比较 uuid(来自 postgresql)和字符串(类中的用户 id)的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ:在通用界面中对来自不同表的列进行逻辑分组

java.lang.ClassNotFoundException:来自jooq代码生成任务的org.postgresql.Driver

比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL

jooq 比较 2 个日期 - 它不喜欢 java.sql.Date

如何比较 NSUUID

无法解析 jOOQ 生成的类 TableOptions