【问题标题】:jOOQ - create value for fieldjOOQ - 为字段创造价值
【发布时间】:2015-11-15 01:59:30
【问题描述】:

我有一个字段Field<T>。我想为该字段创建一个命名值,以便能够在查询中使用它。值的名称应该是字段的名称。

select value as field from ...

这是正确的做法吗?

public <T> Field<T> namedValue(Field<T> field, T value) {
    return DSL.val(value, field).as(field);
}

虽然它有效,但我想知道是否有更短的方法可以做到这一点。我可能在这里很迂腐:)。

更新

我正在创建以下结构:

UPADTE table SET x = alias.x, y = alias.y
FROM (SELECT constant value for x, table2.y FROM table2 WHERE ...) AS alias.

让我们把它简化为(为了这个例子,专注于常量选择):

SELECT
FROM (SELECT constant value for x) AS alias.

首先,我开始:

Select s1 = context.select(DSL.val("TEST"));
Select s2 = context.select(s1.fields()).from(s1);

这导致了不正确的查询:

select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930"

(我不确定这是否是 jOOQ 的正确行为。)

所以,我添加了一个别名:

Select s1 = context.select(DSL.val("TEST").as(X));
Select s2 = context.select(s1.fields()).from(s1);

这导致:

select "alias_76324565"."x" from (select 'TEST' as "x") as "alias_76324565"

这很好用。然后,当常量 vale 为 null 时,我遇到了问题:

Select s1 = context.select(DSL.val(null).as(X));
Select s2 = context.select(s1.fields()).from(s1);

这导致:

select "alias_85795854"."x" from (select cast(? as varchar) as "x") as "alias_85795854"
1400 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding  - Binding variable 1       : null (class java.lang.Object)

这是有道理的,字段类型是未知的。所以我添加了字段(及其类型)如下:

Select s1 = context.select(DSL.val(null, X).as(X));
Select s2 = context.select(s1.fields()).from(s1);

现在绑定正确:

1678 [localhost-startStop-1] TRACE org.jooq.impl.DefaultBinding  - Binding variable 1       : null (class java.lang.String)

全部完成!

【问题讨论】:

  • 用例是什么? Field&lt;T&gt; field 通常是表中的字段吗?所以你想用一个常量替换一个表列?
  • @LukasEder 这确实是表中的一个字段。它适用于update table set ... select ... from ... 语句。 select 子句中的一些投影是常量,这就是我想使用上述函数的地方。
  • 嗯,但您不需要命名这些常量,是吗?或许,您能否使用说明用例的示例 UPDATE 查询来更新您的问题?
  • @LukasEder 我添加了一些历史我是如何提出这个问题的。请参阅我对问题的编辑。它还解释了为什么我必须为常量命名。
  • 哦,我明白了 - 感谢您的更新!还有另一个待处理的功能请求应该在嵌套选择中为独立绑定变量生成列名 - 现在似乎找不到它......

标签: sql api alias jooq


【解决方案1】:

我不认为你可以比你已经拥有的更短。我的意思是,你的 SQL 写着:

value as field

您的 Java/jOOQ 代码如下:

DSL.val(value, field).as(field)

你当然可以静态导入DSL.valDSL.*

import static org.jooq.impl.DSL.*;

然后将内容缩短为:

val(value, field).as(field)

如果您对value 的类型非常确定,则无需将其强制为field 的类型

val(value).as(field)

现在,你绝对不能再短了,你的 namedValue() 函数也不再需要了......

【讨论】:

  • 感谢您的确认!现在唯一悬而未决的问题是查询 select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930" 是否正确(参见原始问题的编辑)。这就是我必须添加别名的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2021-10-30
  • 1970-01-01
  • 2017-06-11
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多