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