可用版本:Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

将 jOOQ 与 JPA Native Query 结合使用

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

这些章节的目标是描述在您有充分理由这样做时该如何操作。然而,大多数情况下,最好直接使用 jOOQ 执行查询,特别是如果您想使用 jOOQ 更高级的功能。这篇博文说明了为什么直接使用 jOOQ 执行查询更好的各种原因

如果您的查询没有真正映射到 JPA 实体,您可以使用以下实用程序方法获取数据库记录的普通、非类型化的 Object[] 表示形式

static List<Object[]> nativeQuery(EntityManager em, org.jooq.Query query) {

    // Extract the SQL statement from the jOOQ query:
    Query result = em.createNativeQuery(query.getSQL());

    // Extract the bind values from the jOOQ query:
    List<Object> values = query.getBindValues();
    for (int i = 0; i < values.size(); i++) {
        result.setParameter(i + 1, values.get(i));
    }

    return result.getResultList();
}

请注意,如果您正在使用自定义数据类型绑定,请确保也将其考虑在内。例如,如下所示

static List<Object[]> nativeQuery(EntityManager em, org.jooq.Query query) {

    // Extract the SQL statement from the jOOQ query:
    Query result = em.createNativeQuery(query.getSQL());

    // Extract the bind values from the jOOQ query:
    int i = 1;
    for (Param<?> param : query.getParams().values())
        if (!param.isInline())
            result.setParameter(i++, convertToDatabaseType(param));

    return result.getResultList();
}

static <T> Object convertToDatabaseType(Param<T> param) {
    return param.getBinding().converter().to(param.getValue());
}

这样,您可以使用 jOOQ API 构建复杂的、类型安全的查询,并让您的jakarta.persistence.EntityManager执行它并附加所有事务语义

List<Object[]> books =
nativeQuery(em, DSL.using(configuration)
    .select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, BOOK.TITLE)
    .from(AUTHOR)
    .join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID))
    .orderBy(BOOK.ID));

books.forEach((Object[] book) -> System.out.println(book[0] + " " + book[1] + " wrote " + book[2]));

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的反馈!

The jOOQ Logo