在 SelectWhereStep 中使用自定义转换器

问题描述 投票:0回答:1

在查询的

SelectWhereStep
中使用自定义转换器的推荐方式是什么?

我有以下数据库表:

product
- id INT
- name VARCHAR
- type VARCHAR

product
表中的值看起来像

id 名字 类型
1 通用书籍 平装书
2 今日新闻 数字报纸
3 热门杂志 纸质杂志

重要的部分是

type
列,它是数据库中的非规范化VARCHAR。它是一种书籍类型和媒介的串联值。

我在 Java 中有一个名为

ProductType
的类,它代表这个:

public class ProductMediumType {
    private ProductType type; // This is an enum
    private Medium medium; // This is an enum
    .....
}

我创建了

org.jooq.Converter
的实现,如下定义:自定义数据类型转换

public class ProductMediumTypeConverter extends AbstractConverter<String, ProductMediumType> {}

我想在

SelectWhereStep
中使用这个:

ProductMediumTypeConverter mediumTypeConverter = .....;
ProductMediumType mediumType = ....;


Product prod = create
    .select(
        PRODUCT.ID, 
        PRODUCT.NAME,
        PRODUCT.TYPE.convert(mediumTypeConverter)
    )
    .from(PRODUCT)
    .where(PRODUCT.TYPE.eq(/* HERE */))
    .fetchInto(Product.class);

我知道我可以直接使用转换器的

.to()
方法,但我认为这样读起来不太好。有更好的方法吗?

此外,我知道我可以创建自定义转换器并在代码生成过程中使用它们,但不幸的是这在我的情况下不可行。

java jooq
1个回答
0
投票

我假设您正在使用 jOOQ 的代码生成器,在这种情况下,您可以简单地将转换器附加到生成的代码,现在您无需再执行任何操作。 jOOQ 将始终自动在数据库类型(例如

String
)和您的用户类型(例如
ProductMediumType
)之间进行转换:

// You'll get the right type in your result sets:
Result<Record3<Integer, String, ProductMediumType>> result =
Product prod = create
    .select(
        PRODUCT.ID, 
        PRODUCT.NAME,
        PRODUCT.TYPE                    // Nothing needed here
    )
    .from(PRODUCT)
    .where(PRODUCT.TYPE.eq(mediumType)) // Nothing needed here either
    .fetch();
© www.soinside.com 2019 - 2024. All rights reserved.