sql - jOOQ——为领域创造值(value)

标签 sql api alias jooq

我有一个字段 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"

这很好用。然后,当常量值为 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);

绑定(bind)现在是正确的:

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

全部完成!

最佳答案

我不认为你可以比现有的短很多。我的意思是,您的 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() 函数...

关于sql - jOOQ——为领域创造值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32134973/

相关文章:

mysql - SQL 将值拆分为多行

mysql - SQL中GROUP BY的基本用法

java - 要求补丁颜色时用 Java 错误控制 NetLogo?

permissions - Yii Framework : Alias "application.extensions.langhandler.ElangHandler" is invalid. 确保它指向现有的 PHP 文件

sql - PostgreSQL 不接受 WHERE 子句中的列别名

sql - 如何检查 ODBC 通信,以查看正在传递的 SQL?

MySQl 创建函数来检查字符串是否正确

javascript - 如何使用AJAX调用API并返回数据?

api - Google 放置不带国家/地区名称的自动填充建议

mysql - 别名不适用于 MYSQL 中的 IF 条件