我的后端是postgresql。我正在尝试编写一个简单的函数来使用 jooq 记录从数据库中获取数据。该表的 DAO 是我编写的。我面临的问题是比较数据库中的 UUID 和提供给函数的字符串。
public Correspondence fetchByExternalId(String externalId) {
CorrespondenceRecord correspondenceRecord =
create.fetchOne(Tables.CORRESPONDENCE,
Tables.CORRESPONDENCE.USERID.eq(externalId));
CORRESPONDENCE.USERID 是 UUID,externalId 是 String;运算符 eq 是我无法在这里实现的运算符,它在以前的场合对我有用。
显示的错误是: 无法解析方法“eq(java.lang.String)”
当我提到jOOQ site for help时它显示“eq”是它建议使用的运算符!
任何人都可以帮助我找到替代方案或告诉我哪里出了问题吗?
最佳答案
jOOQ 是一个类型非常安全的 API,因此您无法比较 UUID
类型为 String
使用 eq()
类型,因为 eq()
method使用通用 <T>
您的类型CORRESPONDENCE.USERID
列,即 UUID
:
TableField<..., java.util.UUID> USERID = ...
在 Java 客户端中生成 UUID 绑定(bind)值
您必须提供 externalId
以 UUID
的形式输入,例如:
CORRESPONDENCE.USERID.eq(UUID.fromString(externalId))
...或者,您让 jOOQ 为您转换该类型:
CORRESPONDENCE.USERID.eq(CORRESPONDENCE.USERID.getDataType().convert(externalId))
以上两者是等效的。
在数据库中生成 UUID 绑定(bind)值
您始终可以通过强制转换将类型转换工作推迟到数据库(这将导致呈现 CAST(? AS UUID)
:
CORRESPONDENCE.USERID.eq(DSL.cast(externalId, UUID.class));
...或者通过强制变量遵守UUID
类型(相信数据库可以将 VARCHAR
类型隐式转换为 UUID
类型):
CORRESPONDENCE.USERID.eq(DSL.coerce(DSL.val(externalId), UUID.class));
关于java - jOOQ : compare uuid(from postgresql) and string(user id in class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216487/