【问题标题】:jooq throws NPE when fetchOne is used使用 fetchOne 时 jooq 抛出 NPE
【发布时间】:2018-01-02 16:51:32
【问题描述】:

我对使用主键进行查询的表进行了简单查询。

            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

【问题讨论】:

    标签: mysql jooq


    【解决方案1】:

    为什么会抛出 NullPointerException

    从技术上讲,jOOQ 不会抛出 NullPointerException。您在潜在的null 记录上调用into(Class) 确实如此,正如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);
    

    注意,这种内置的 fetch 方法有一个待处理的功能请求: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);
    

    【讨论】:

    • 感谢您的回答。我发现 NPE 是因为我像问题中所说的那样打电话给into,但找不到替代方案。
    猜你喜欢
    • 2016-09-04
    • 2023-03-06
    • 2021-01-19
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多