我的后端是postgresql。我正在尝试使用jooq记录编写一个简单的函数来从数据库中获取数据。这张桌子的DAO是我写的。我面临的问题是比较db中的UUID和提供给函数的String。
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'是它建议使用的运算符!
任何人都可以帮我替代或者告诉我哪里出错了吗?
答案 0 :(得分:2)
jOOQ是一种非常类型安全的API,因此您无法使用UUID
将String
类型与eq()
类型进行比较,因为eq()
method使用了通用<T>
您CORRESPONDENCE.USERID
列的类型,即UUID
:
TableField<..., java.util.UUID> USERID = ...
您必须以externalId
类型的形式提供UUID
,例如:
CORRESPONDENCE.USERID.eq(UUID.fromString(externalId))
...或者,你让jOOQ为你转换那种类型:
CORRESPONDENCE.USERID.eq(CORRESPONDENCE.USERID.getDataType().convert(externalId))
以上两者都是等效的。
您始终可以通过强制转换将类型转换工作推迟到数据库(这将导致呈现CAST(? AS UUID)
:
CORRESPONDENCE.USERID.eq(DSL.cast(externalId, UUID.class));
...或者通过强制变量来遵守UUID
类型(相信数据库可以隐式地将VARCHAR
类型转换为UUID
类型):
CORRESPONDENCE.USERID.eq(DSL.coerce(DSL.val(externalId), UUID.class));