Available in versions: (可用版本:) Dev (开发版) (3.21) | Latest (3.20) (最新版 (3.20)) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14

ConverterProvider (转换器提供者)

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

jOOQ 在 org.jooq.tools.Convert 中支持一些有用的常用 JDBC 数据类型之间的数据类型转换。 这些转换包括,例如

int i = Convert.convert("1", int.class); // Yields 1
Date d = Convert.convert("2000-01-01", Date.class); // Yields Date.valueOf("2000-01-01")

这些自动转换在整个 jOOQ API 中可用,例如在编写时

Record record = create.fetchSingle(field("current_date"));
LocalDate d1 = record.get(0, LocalDate.class);
LocalDate d2 = create.fetchSingle(field("current_date"), LocalDate.class);

当映射 POJOs 时,也会隐式应用这些自动转换,如前几节所示

class POJO {
    LocalDate date;
}

POJO pojo = create.fetchSingle(field("current_date").as("date")).into(POJO.class);

Overriding the DefaultConverterProvider (覆盖 DefaultConverterProvider)

有时,可能需要通过自定义 org.jooq.ConverterProvider 覆盖 org.jooq.impl.DefaultConverterProvider 提供的默认行为。 例如,假设您有一个这样的对象

public class Name {
    public String firstName;
    public String lastName;
}

public class Book {
    public String title;
}

public class Author {
    public Name name;
    public List<Book> books;
}

现在,假设投影一些 JSON functions (JSON 函数)XML functions (XML 函数)。 您可能希望将它们分层映射到上面的数据结构

List<Author> authors = create()
  .select(jsonObject(
     key("name").value(jsonObject(
       key("firstName").value(AUTHOR.FIRST_NAME),
       key("lastName").value(AUTHOR.LAST_NAME)
     )),
     key("books").value(jsonArrayAgg(
       jsonObject("title", BOOK.TITLE)
     ))
  ))
  .from(AUTHOR)
  .join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID))
  .groupBy(AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
  .orderBy(AUTHOR.ID)
  .fetchInto(Author.class);

如果 jOOQ 在您的类路径中找到 Jackson 或 Gson,则上述方法可以立即使用。 如果您想覆盖 jOOQ 的开箱即用绑定,您可以轻松地通过实现 org.jooq.ConverterProvider 来提供您自己的绑定,例如,使用 Jackson 库

class JSONConverterProvider implements ConverterProvider {
    final ConverterProvider delegate = new DefaultConverterProvider();
    final ObjectMapper mapper = new ObjectMapper();

    @Override
    public <T, U> Converter<T, U> provide(Class<T> tType, Class<U> uType) {

        // Our specialised implementation can convert from JSON (optionally, add JSONB, too)
        if (tType == JSON.class) {
            return Converter.ofNullable(tType, uType,
                t -> {
                    try {
                        return mapper.readValue(((JSON) t).data(), uType);
                    }
                    catch (Exception e) {
                        throw new DataTypeException("JSON mapping error", e);
                    }
                },
                u -> {
                    try {
                        return (T) JSON.valueOf(mapper.writeValueAsString(u));
                    }
                    catch (Exception e) {
                        throw new DataTypeException("JSON mapping error", e);
                    }
                }
            );
        }

        // Delegate all other type pairs to jOOQ's default
        else
            return delegate.provide(tType, uType);
    }
}

配置

然后,可以将上述 provider 提供给您的 Configuration (配置),例如,如下所示

configuration.set(new JSONConverterProvider());

注意:为了获得 Jackson 和 kotlin 的最佳效果,还请将 jackson-module-kotlin 放在类路径中。

引用此页

反馈

Do you have any feedback about this page? (您对此页面有任何反馈吗?) We'd love to hear it! (我们很乐意听到您的反馈!)

The jOOQ Logo