当前位置: 首页 > 知识库问答 >
问题:

jOOQ select into POJO,只为某些字段指定映射

仇炜
2023-03-14

我将jOOQ与普通SQL(不是生成的代码)一起使用。我试图直接选择一个POJO,它有一些enum类型的字段。

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类型的,在这种情况下使用这个映射(或转换器)”。

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

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

共有1个答案

郤令
2023-03-14

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

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

  1. 自动为您生成枚举类型(如果您使用的是MySQL或PostgreSQL枚举)
  2. 允许您使用

即使您没有使用代码生成器,您也可以通过指定自己的DataType自定义转换器/绑定中获益:

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

现在,您可以使用DSL在普通SQLField表达式中使用该类型。字段(字符串、数据类型)

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

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

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

这也是你所说的“高级映射器”,但是你可以全局注册它,并在任何你想映射到MyType.class的时候重用它。

jOOQ的未来版本(还不是jOOQ 3.9)可能支持转换器注册表,该注册表允许对任何类型

 类似资料:
  • 默认情况下,MapStruct映射源和目标的所有属性,如果它们具有相同的名称。中的元素可用于省略任何字段映射。但那不是我想要的。我想控制映射策略。我想指定如下内容: 现在,这个映射仅仅意味着将id和名称从源映射到目的地。除非在mappings注释中指定,否则不应映射其他字段。

  • 我正在使用Hibernate 4.1和Notess从Java映射到DB。 我有一个超类,它的属性是使用<code>@MappedSuperClass</code>映射的。 这个类有很多子类,但是有些属性对某些子类无效,因此我不想将它们映射到这些子类的数据库中。 有什么方法可以实现这一点吗? 另外,我不确定这是否是正确的设计,其中只有超类的属性子集适用于子类?我也愿意改变设计,如果有人能给我一个有效

  • 我知道这是一个非常简单的问题,但我似乎找不到一个令人满意的答案。另外,我对Mongo完全是个新手。这显然无济于事。 假设我收藏了...我希望将mongo中的$toupper函数应用于具有_id和的记录的字段,而不是应用于具有的记录。 我一直在玩Mongo的聚合(针对我在google中发现的),但我得到的最多的是一个返回“name”字段的查询,但是: 它返回数据库中的所有记录(不仅是ObjectId

  • 问题内容: 有没有一种使用Jackson JSON Processor进行自定义字段级序列化的方法?例如,我想上课 序列化为以下JSON: 请注意,age = 25被编码为 数字, 而favoriteNumber = 123被编码为 string 。开箱即用的杰克逊将集结到一个号码。在这种情况下,我希望将favoriteNumber编码为字符串。 问题答案: 您可以实现自定义序列化器,如下所示:

  • 问题内容: 我正在使用Elasticsearch索引我的文档。 是否有可能指示它仅返回特定字段,而不是它存储的整个json文档? 问题答案: 是的 使用源过滤器。如果您使用JSON搜索,它将看起来像这样: 在ES 2.4及更低版本中,您还可以在search API中 使用fields选项: ES 5+中已弃用此功能。而且,源过滤器更强大!

  • 运行查询后,我从MongoDB返回一个JSON值。问题是我不想返回与我的返回相关的所有JSON,我尝试搜索文档,但没有找到正确的方法。我想知道如果可能的话会怎样,如果可能的话,正确的做法是什么。示例:在数据库中 如果某个字段为用户存在,但不返回另一个字段,那么返回该字段的正确方式是什么。对于上面的示例,我想返回RMS的字段和扎克伯格的字段。这就是我试图找到的字段是否为空,但它似乎不起作用。