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)的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.ClassNotFoundException:来自jooq代码生成任务的org.postgresql.Driver
比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL