我在一个用主键查询的表上有一个简单的查询。
dslContext.select(XXX.NAME)
.from(XXX)
.where(
XXX.ID.eq(id)
.and(XXX.LEVEL.eq(2))
.and(XXX.NAME.isNotNull())
)
.fetchOne().into(String.class);
在我的情况下,对于特定的id,查询会产生一个空集。但是jooq似乎抛出了NPE。当我进一步调查时,fetchOne()
会调用CursorImpl.fetchOne()
。这会检查结果的大小,如果不是1,则返回null。我有一个链式into(String.class)
,它会被调用此空值,从而导致NPE。
我不想调用fetch()并迭代结果/获取列表的第一个元素。
是否有另一种编写查询的方法,如果没有数据,它会抛出org.jooq.exception.NoDataFoundException
?
答案 0 :(得分:3)
NullPointerException
从技术上讲,jOOQ不会抛出NullPointerException
。正如into(Class)
null
条记录的调用ResultQuery.fetchOne()
也可以
<强>返回:强>
结果记录,如果查询未返回任何记录,则返回null。
NoDataFoundException
。您可以使用fetchOptional()
,然后使用orElseThrow()
:
String string =
dslContext.select(XXX.NAME)
.from(XXX)
.where(
XXX.ID.eq(id)
.and(XXX.LEVEL.eq(2))
.and(XXX.NAME.isNotNull())
)
.fetchOptional()
.orElseThrow(() -> new NoDataFoundException("..."))
.into(String.class);
注意,这种内置提取方法有待处理的功能请求:https://github.com/jOOQ/jOOQ/issues/5411
在jOOQ 3.10中,您将能够写下:
String string =
dslContext.select(XXX.NAME)
.from(XXX)
.where(
XXX.ID.eq(id)
.and(XXX.LEVEL.eq(2))
.and(XXX.NAME.isNotNull())
)
.fetchSingle() // Might throw a NoDataFoundException but never returns null
.into(String.class);