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! (我们很乐意听到您的反馈!)