我目前正在使用jOOQ构建我的SQL(通过mvn插件生成代码).

执行创建的查询is not done by jOOQ(使用vert.X SqlClient).

假设我想 Select 共享一些相同列名的两个表的所有列.E、 g.UserAccount(100,101,...)Product(100,101,...).执行以下代码时

val userTable = USER_ACCOUNT.`as`("u")
val productTable = PRODUCT.`as`("p") 

create().select().from(userTable).join(productTable).on(userTable.ID.eq(productTable.AUTHOR_ID))

构建方法query.getSQL(ParamType.NAMED)返回如下查询

SELECT "u"."id", "u"."name", ..., "p"."id", "p"."name", ... FROM ...

这里的问题是,结果集将包含100101列两次,没有前缀"u."或"p.",因此我无法正确映射/解析它.

有没有一种方法可以让jOOQ在不需要进一步手动操作的情况下将这些列别名为如下所示?

SELECT "u"."id" AS "u.id", "u"."name" AS "u.name", ..., "p"."id" AS "p.id", "p"."name" AS "p.name" ...

我正在使用holy Postgres数据库:)

EDIT:目前的做法是

val productFields = productTable.fields().map { it.`as`(name("p.${it.name}")) }
val userFields = userTable.fields().map { it.`as`(name("p.${it.name}")) }

create().select(productFields,userFields,...)...

但这感觉真的很刺耳

推荐答案

如何正确地从记录中取消引用表

您应该始终使用传递给查询的列引用来从结果中的记录中取消引用值.如果没有显式传递列引用,则使用通过Table.fields()生成的表中的引用.

在您的代码中,这将对应于:

userTable.NAME
productTable.NAME

因此,在生成的记录中,请执行以下操作:

val rec = ...
rec[userTable.NAME]
rec[productTable.NAME]

Using Record.into(Table)

由于您似乎正在投影所有列(您真的需要所有列吗?)对于生成的POJO类,如果需要,仍然可以执行此中间步骤:

val rec = ...
val userAccount: UserAccount = rec.into(userTable).into(UserAccount::class.java)
val product: Product = rec.into(productTable).into(Product::class.java)

因为生成的表具有所有必要的元数据,所以它可以决定哪些列属于它,哪些不属于它.POJO没有这些元数据信息,这就是为什么它无法消除重复列名的歧义.

使用嵌套记录

您也可以在SQL中直接使用nested records来生成以下两种类型之一:

  • Record2<Record[N], Record[N]>(例如使用DSL.row(table.fields()))
  • Record2<UserAccountRecord, ProductRecord>(例如使用DSL.row(table.fields()).mapping(...),或从jOOQ 3.17开始直接使用Table<R> as a SelectField<R>)

第二个jOOQ 3.17解决方案如下所示:

// Using an implicit join here, for convenience
create().select(productTable.userAccount(), productTable)
        .from(productTable)
        .fetch();

The above is using implicit joins, for additional convenience

自动别名所有列

当在SQL中对列进行"自动别名"时,用户可能会喜欢很多风格.jOOQ提供的任何解决方案都不会比您已经找到的解决方案更好,因此,如果您仍然希望自动别名所有列,那么只需执行您所做的操作即可.

但通常,自动别名的愿望是由于误解了在jOOQ中执行某些操作的最佳方法(请参见上面的选项)而派生出的特性请求,因此理想情况下,您不必遵循自动别名的道路.

Postgresql相关问答推荐

使用多个分隔符拆分SQL

在Docker Compose中获取CSV文件数据?

是否可以在psql查询输出中删除新行末尾的+号?

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

Postgres:创建分区需要很长时间

无法使用PGx连接到Postgres数据库AWS RDS

合并两个字典并创建一个包含更新凭据的字典列表

Postgres 查询指向国外数据工作者的分区表比直接查询 fdw 慢很多倍

Windows上的psql:错误:编码UTF8的字节序列无效:0xc8 0x20

带有初始数据的 docker postgres 不会在提交中持久化

在 Postgresql 中获取星期几

从 Postgres 数据库中删除所有函数

获取 psycopg2 count(*) 结果数

Python PostgreSQL 模块.哪个最好?

Postgresql 中的 NOT EXISTS 子句

错误:关系列不存在 PostgreSQL,无法运行插入查询

使用 Postgresql 数据库(OSX Lion)创建 Rails 3.1 应用程序

SQL:子查询的列太多

错误:permission denied for language c

Django 中的唯一模型字段和区分大小写(postgres)