如何在 INSERT 操作期间将可选<String>转换为 jOOQ 中 Null 的固定 UUID 值?

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

我正在使用一个处理空值的数据库非常糟糕。我不想使用可为 null 的字符串,而是使用固定的、非常罕见的值(本质上是 UUID)作为 null 的占位符。

我的目标是在Java中使用Optional而不是String作为字段,每当我将Optional.empty()绑定到INSERT INTO语句时,我希望jOOQ自动将其转换为我的UUID,我将其用作空的标志选修的。当可选值有值时,我希望 jOOQ 像往常一样使用提供的值。

我尝试设置一个转换器,但它似乎只在 SELECT 操作期间起作用,而不是在插入阶段起作用。我怀疑我可能遗漏了一些东西。

这是我到目前为止所拥有的:

package com.res.jooq.neo4j;

public class Neo4jOptionalUtils {

    public static final String EMPTY_STRING = "empty-string-optional-ac4ea8cd-9128-4ee3-bb2c-48a1c239ffd2";

    private Neo4jOptionalUtils() {
        // private constructor to hide the implicit public one
    }

    public static String optional(String value) {
        return value == null ? EMPTY_STRING : value;
    }

    public static String fromOptional(String optional) {
        return EMPTY_STRING.equals(optional) ? null : optional;
    }
}

我正在使用此实用程序类将 null 值转换为我的固定 UUID,反之亦然。

如何配置 jOOQ 在 INSERT 操作期间自动应用此转换?

有没有办法确保 SELECT 和 INSERT 操作都遵守此转换逻辑,而无需手动转换每个值?

java jooq
1个回答
0
投票

因此,这个问题似乎假设在

Field<U>
INSERT
中使用
SELECT
引用之间存在差异(其中
U
是转换后的用户定义类型):

我尝试设置一个转换器,但它似乎只在 SELECT 操作期间起作用,而不是在插入阶段起作用。我怀疑我可能遗漏了一些东西。

如何配置 jOOQ 在 INSERT 操作期间自动应用此转换?

这里的答案是不,你不必做任何特别的事情。转换后的字段可以在任何地方使用,开箱即用。您可能只是没有使用转换后的字段。假设您正在使用 jOOQ 的代码生成器,只需在各处使用该字段即可:

List<MyType> list =
ctx.select(T.CONVERTED)
   .from(T)
   .fetch(T.CONVERTED);

ctx.insertInto(T)
   .columns(T.CONVERTED)
   .values(new MyType()) // Works out of the box
   .execute();

我很乐意回答有关您所做的事情的后续问题具体,以帮助您找到哪里出错了。

© www.soinside.com 2019 - 2024. All rights reserved.