当使用fetchOne时,jooq会抛出NPE

时间:2017-07-27 06:11:53

标签: mysql jooq

我在一个用主键查询的表上有一个简单的查询。

            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

1 个答案:

答案 0 :(得分:3)

为什么要抛出NullPointerException

从技术上讲,jOOQ不会抛出NullPointerException。正如into(Class)

中的Javadoc所记录的那样,您对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);
相关问题