jooq 在使用 fetchOne 时抛出 NPE

问题描述 投票:0回答:2

我对表有一个简单的查询,它使用主键进行查询。

            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

mysql jooq
2个回答
9
投票

为什么会抛出
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);

0
投票

如果没有找到任何东西,使用

fetchSingle
让 jOOQ 抛出
NoDataFoundException

https://www.jooq.org/doc/latest/manual/sql-execution/fetching/#various-modes-of-fetching

© www.soinside.com 2019 - 2024. All rights reserved.