gpt4 book ai didi

postgresql - 没有自定义转换器的 jOOQ 查询表达式类型安全

转载 作者:行者123 更新时间:2023-12-02 12:45:23 30 4
gpt4 key购买 nike

我正在尝试使用 Kotlin 的扩展函数以类型安全的方式通过 PostgreSQL 的全文搜索扩展 jOOQ。

我的问题是 DSL.function 不“知道”我的自定义类/类型 TsQuery 和 TsVector 并引发异常。 Function 类本身没有公共(public)构造函数。

org.jooq.exception.SQLDialectNotSupportedException: Type class jooq.fulltext.TsVector is not supported in dialect DEFAULT


class TsQuery

class TsVector

fun Field<String>.toTsVector(searchConfig: String): Field<TsVector> {
return DSL.function(
"to_tsvector",
TsVector::class.java,
DSL.inline(searchConfig),
DSL.coalesce(this, "")
)!!
}

fun String.toTsQuery(searchConfig: String): Field<TsQuery> {
return DSL.function(
"to_tsquery",
TsQuery::class.java,
DSL.inline(searchConfig),
DSL.value(this)
)!!
}

fun Field<TsVector>.tsMatches(query: Field<TsQuery>): Condition {
return DSL.condition(
"{0} @@ {1}",
this,
query
)!!
}

fun Field<TsVector>.tsRank(query: Field<TsQuery>): Field<Double> {
return DSL.function(
"ts_rank",
Double::class.java,
this,
query
)!!
}

如果我用 String 替换 TsQuery 和 TsVector ,那么它可以工作,但我打字松了。
我只想将它们用于查询构建,我不需要能够将这些类型解析/转换为 Kotlin。

最佳答案

虽然您可以使用内部类使其工作,例如 DefaultDataType ( as in your own answer ),您不应该这样做,因为您的解决方案可能会在 future 的任何次要版本甚至补丁版本中中断。

在 jOOQ 中引入对新数据类型的支持的正确方法是实现 a converter or even better, a binding .绑定(bind)将允许您影响 jOOQ 如何将变量绑定(bind)到准备好的语句,以及它如何从结果集中读取它们。

您的 toTsVector()然后方法看起来像这样(请原谅任何 Kotlin 错误,我是 Java 人):

fun Field<String>.toTsVector(searchConfig: String): Field<TsVector> {
return DSL.function(
"to_tsvector",
SQLDataType.OTHER.asConvertedDataType(MyTsVectorBinding()),
DSL.inline(searchConfig),
DSL.coalesce(this, "")
)!!
}

您现在可以实现(我使用 Java 是因为缺少 kotlin-fu,但这没关系):

class MyTsVectorBinding implements Binding<Object, TsVector> {
// ...
}

关于postgresql - 没有自定义转换器的 jOOQ 查询表达式类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60830976/

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