JOOQ - 将 fetchOne().into() 转换为 fetchValue(query)
Posted
技术标签:
【中文标题】JOOQ - 将 fetchOne().into() 转换为 fetchValue(query)【英文标题】:JOOQ - convert fetchOne().into() to fetchValue(query) 【发布时间】:2019-01-11 13:33:34 【问题描述】:In this answer,作者提到为了避免NPE,可以使用fetchValue(query)
方法。问题是如何将 OP 的代码转换为query
?我有类似的代码,粘贴在下面,也想把它变成一个查询。
return jooqDSLContext.select()
.from(CL_LOGIN)
.join(CL_USERS)
.on(CL_LOGIN.CL_USER_ID.eq(CL_USERS.CL_USER_ID))
.where(CL_USERS.EMAIL1.eq(email))
.fetchOne().into(CL_LOGIN);
JOOQ 非常强大并且具有许多功能,但不幸的是,我尝试使用连接创建独立查询对象的所有内容都无法编译。
编辑:提供的答案确实帮助我回避了拥有查询对象的需要。但是对于那些想知道如何获取查询对象的人,您可以使用getQuery()
方法...参见下面的示例。
SelectQuery<Record1<String>> query = jooqDSLContext.select(USER_LOGIN.ACCOUNT_STATUS)
.from(USER_LOGIN)
.where(USER_LOGIN.USER_ID.eq(userId))
.getQuery();
【问题讨论】:
【参考方案1】:观察方法DSLContext.fetchValue(ResultQuery<R>)
的签名,其中R extends Record1<T>
。这意味着查询的预期行类型是Record1<T>
与任意<T>
类型。换句话说,您必须在 SELECT
子句中准确地投影一列。
您似乎想投影CL_LOGIN
类型的整个记录,因此fetchValue()
不适用于您的用例。
但请注意,还有ResultQuery.fetchOneInto(Table)
,这是一种包装空检查和into()
调用的便捷方法。所以,就写吧:
return jooqDSLContext.select()
.from(CL_LOGIN)
.join(CL_USERS)
.on(CL_LOGIN.CL_USER_ID.eq(CL_USERS.CL_USER_ID))
.where(CL_USERS.EMAIL1.eq(email))
.fetchOneInto(CL_LOGIN);
【讨论】:
谢谢卢卡斯。我读了很多你在这里和其他网站上发布的答案。非常感谢您的工作。以上是关于JOOQ - 将 fetchOne().into() 转换为 fetchValue(query)的主要内容,如果未能解决你的问题,请参考以下文章