我正在使用一个处理空值的数据库非常糟糕。我不想使用可为 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 操作都遵守此转换逻辑,而无需手动转换每个值?
因此,这个问题似乎假设在
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();
我很乐意回答有关您所做的事情的后续问题具体,以帮助您找到哪里出错了。