我对表有一个简单的查询,它使用主键进行查询。
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)
,它会在这个 null 值上被调用,从而导致 NPE。
我不想调用 fetch() 并迭代结果/获取列表的第一个元素。
是否有另一种编写查询的方法,以便在没有数据时抛出
org.jooq.exception.NoDataFoundException
?
NullPointerException
从技术上讲,jOOQ 不会抛出
NullPointerException
。您对潜在的 into(Class)
记录的调用
null
确实如此,正如 ResultQuery.fetchOne()
的 Javadoc 中所记录的那样
退货:
如果查询没有返回记录,则结果记录或 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);
如果没有找到任何东西,使用
fetchSingle
让 jOOQ 抛出 NoDataFoundException
。
https://www.jooq.org/doc/latest/manual/sql-execution/fetching/#various-modes-of-fetching