我如何使用 - > (箭头)操作员?

时间:2017-05-05 10:53:21

标签: java postgresql jooq

我有一个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,但我觉得复杂只是为了实现它,不是吗?

2 个答案:

答案 0 :(得分:2)

如果在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()会将您的字符串文字转义为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();

答案 1 :(得分:0)

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上执行编译器