如何使用 ->(箭头)运算符?
How do I use the -> (arrow) operator?
我有一个 Postgresql
数据库,我正在我的应用程序中使用 JOOQ
。我需要在需要运算符 ->
的地方实现一个查询。我对 select
和 left join
使用运算符。往下看:
select coalesce(u.name, data->'username') as username, user_location, user_time
from log
left join users u on (data->'username') is not null and (data->'username') = u.username
where ((data->'code') is null or (data->'code') <> 'no')
实施此案例的最佳方法是什么?我发现了这个 link 但我认为仅仅实现它就太复杂了,不是吗?
JOOQ不支持。检查 https://github.com/jOOQ/jOOQ/issues/3491
编辑:
替代方案是将 JOOQ 简单地用作查询执行器:
在此处查看示例 https://www.jooq.org/doc/2.6/manual/getting-started/use-cases/jooq-as-a-sql-executor/
或检索 json 并在 Java
上执行牧师
如果 jOOQ(还)不支持某些功能,您可以随时求助于 plain SQL API。在您的情况下,您可以编写如下实用程序:
public static Field<String> jsonAttr(Field<?> json, String attrName) {
return DSL.field("{0}->{1}", String.class, json, DSL.inline(attrName));
}
注意DSL.inline()
will escape your string literal to prevent SQL injection。始终小心使用普通 SQL API
的这种可能性
您现在可以这样使用上面的内容了:
// Assuming this static import
import static org.jooq.impl.DSL.*;
// Aliasing
Users u = USERS.as("u");
// You didn't qualify all your columns, so I'm assuming DATA is in LOG
DSL.using(configuration)
.select(
coalesce(u.NAME, jsonAttr(LOG.DATA, "username")).as("username"),
u.USER_LOCATION,
u.USER_TIME)
.from(LOG)
.leftJoin(u)
.on(jsonAttr(LOG.DATA, "username").isNotNull())
.and(jsonAttr(LOG.DATA, "username").eq(u.USERNAME))
.where(jsonAttr(LOG.DATA, "code").isNull())
.or(jsonAttr(LOG.DATA, "code").ne("no"))
.fetch();
我有一个 Postgresql
数据库,我正在我的应用程序中使用 JOOQ
。我需要在需要运算符 ->
的地方实现一个查询。我对 select
和 left join
使用运算符。往下看:
select coalesce(u.name, data->'username') as username, user_location, user_time
from log
left join users u on (data->'username') is not null and (data->'username') = u.username
where ((data->'code') is null or (data->'code') <> 'no')
实施此案例的最佳方法是什么?我发现了这个 link 但我认为仅仅实现它就太复杂了,不是吗?
JOOQ不支持。检查 https://github.com/jOOQ/jOOQ/issues/3491
编辑: 替代方案是将 JOOQ 简单地用作查询执行器: 在此处查看示例 https://www.jooq.org/doc/2.6/manual/getting-started/use-cases/jooq-as-a-sql-executor/
或检索 json 并在 Java
上执行牧师如果 jOOQ(还)不支持某些功能,您可以随时求助于 plain SQL API。在您的情况下,您可以编写如下实用程序:
public static Field<String> jsonAttr(Field<?> json, String attrName) {
return DSL.field("{0}->{1}", String.class, json, DSL.inline(attrName));
}
注意DSL.inline()
will escape your string literal to prevent SQL injection。始终小心使用普通 SQL API
您现在可以这样使用上面的内容了:
// Assuming this static import
import static org.jooq.impl.DSL.*;
// Aliasing
Users u = USERS.as("u");
// You didn't qualify all your columns, so I'm assuming DATA is in LOG
DSL.using(configuration)
.select(
coalesce(u.NAME, jsonAttr(LOG.DATA, "username")).as("username"),
u.USER_LOCATION,
u.USER_TIME)
.from(LOG)
.leftJoin(u)
.on(jsonAttr(LOG.DATA, "username").isNotNull())
.and(jsonAttr(LOG.DATA, "username").eq(u.USERNAME))
.where(jsonAttr(LOG.DATA, "code").isNull())
.or(jsonAttr(LOG.DATA, "code").ne("no"))
.fetch();