gpt4 book ai didi

java - jOOQ select 到 POJO 中,只为某些字段指定映射

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:21 25 4
gpt4 key购买 nike

我将 jOOQ 与纯 SQL(不是生成的代码)一起使用。我正在尝试直接选择具有某些枚举类型字段的 POJO。

MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.into(MyType.class);

在我看来,我只能为我的整个 POJO 指定一个高级映射器,如下所示:

MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.map(new RecordMapper<Record, MyType>() {
@Override
public MyType map(Record record) {
...
}
});

我找不到只为某些字段提供映射或转换器的方法。具体来说,我想告诉 jooq 类似“正常转换所有字段,除非我的 POJO 中的字段是 MyEnum 类型,在这种情况下使用此映射(或转换器)”。

如何为某些字段指定映射器而不是其他字段?

顺便说一句,我注意到我可以在配置级别做类似的事情,将数据库字段名称与通配符匹配(如 here 所述),但我认为如果决定由字段类型驱动会更好在 POJO 中。

最佳答案

有不同的方法来解决这个问题:

1。使用代码生成器

显然。我知道你没有使用它,但也许有人会发现这个问题。在这种情况下,代码生成器将:

  1. 自动为您生成枚举类型(如果您使用的是 MySQL 或 PostgreSQL 枚举)
  2. 允许您使用 <forcedTypes/> ,您可以在其中实现自己的 converters和/或 bindings

2。对普通 SQL 也使用显式转换器/绑定(bind)

即使您不使用代码生成器,您也可以通过指定自己的 DataType 从自定义转换器/绑定(bind)中获益。 :

// Assuming that the enum type enumerates varchar values:
SQLDataType<MyEnum> myEnumType =
SQLDataType.VARCHAR.asConvertedDataType(new MyEnumConverter());

现在,您可以在纯 SQL 中使用该类型 Field表达式,使用 DSL.field(String, DataType)

context.select(field("Column", myEnumType), ...)
.from(table("Table"))

在这种情况下,在您的记录映射器中不再需要显式转换,因为 jOOQ Record将已经包含所需的数据类型。

3。使用自定义 RecordMapperProvider

如果您正在使用 into(Class) 中的任何一个方法,默​​认情况下, DefaultRecordMapper 用来。它知道如何通过调用 EnumClass.valueOf(stringValue) 将字符串转换为枚举。 .如果这不是所需的行为(正如您的问题所暗示的那样),那么您仍然可以通过提供自己的 RecordMapperProvider 来覆盖默认行为。 .

这也是您所说的“高级映射器”,但是您可以在全局范围内注册它,并在您想要映射到 MyType.class 时随时重用它。 .

(4.使用转换器注册表)

jOOQ 的 future 版本(还不是 jOOQ 3.9)可能会支持转换器注册表,允许为任何类型对实现默认转换 <T, U> .这是问题 #5713 .

关于java - jOOQ select 到 POJO 中,只为某些字段指定映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com