缺少表别名会回退到仅使用字段名称

时间:2017-09-12 13:54:42

标签: java sql jooq

我的桌子

DataReader

使用以下表格

N
ID|T_ID
1|1
2|2

T
ID|NAME
1|T1
2|T2

它提供了歧义警告,但即使别名错误,仍然会获得值。我希望它返回“null”,我想它只回到使用字段名称。

任何想法如果在别名错误的情况下我应该如何使用它来获取“null”?

修改

我会尝试提供一个更具体的例子

我的表格如下

com.db.N N_TABLE = N.as("N_TABLE");
com.db.T T_TABLE = T.as("T_TABLE");
com.db.T T2_TABLE = T.as("T2_TABLE"); //Random alias, not used in query

SelectQuery selectQuery = create.selectQuery();
selectQuery.addFrom(N_TABLE);
selectQuery.addJoin(T_TABLE, JoinType.LEFT_OUTER_JOIN, T_TABLE.ID.eq(N_TABLE.T_ID));

Result<Record> result = selectQuery.fetch();
for (Record record : result) {
  System.out.println(record.get(T2_TABLE.NAME));
}

表格中的数据

CREATE TABLE user
(
  id bigserial NOT NULL,
  username character varying(200) NOT NULL,
  last_name character varying(100),
  created_user_id bigint NOT NULL,
  modified_user_id bigint NOT NULL,
  CONSTRAINT pk_user PRIMARY KEY (id),
  CONSTRAINT user_username_key UNIQUE (username)
)

代码

3;"admin";"admin";3;3
4;"test";"test";4;3

在jooq 3.9.3和3.9.5上测试

1 个答案:

答案 0 :(得分:1)

按设计工作

在SQL中,结果集中没有合格的列名。相反,结果集(与任何其他表一样)具有一组列,每列都有一个名称,由jOOQ&#39; Field.getName()描述。现在,不幸的是,#34;在顶级SELECT语句中,您可以在所有SQL方言中以及在jOOQ中拥有重复的列名。当您连接两个表并且两个表都具有例如一个ID列。这样,您就不必仅因为出现歧义而重命名每一列。

如果表/结果中确实有重复的列名,jOOQ将应用TableLike.field(Field)中描述的算法

  

这将返回:

     
      
  • 与参数字段相同的字段(通过标识比较)。
  •   
  • 一个等于参数字段的字段(完全匹配的完全限定名称)。
  •   
  • 一个等于参数字段的字段(部分匹配限定名称)。
  •   
  • 一个名称等于参数字段名称的字段。
  •   
  • 否则为null。
  •   
     

如果多个字段具有相同的名称,则返回第一个字段并记录警告。

正如您所看到的,这里的基本原理是,如果结果集中的字段与您在结果集中查找的字段之间没有完整或部分标识或限定名称相等,那么该字段Field.getName()中的名称用于查找字段。

关于列匹配歧义的附注

首先,您已经提到日志中存在&#34;模糊匹配&#34; 警告,然后消失。那个警告表示两列是同一个Field.getName(),但它们都不是&#34;确切的&#34;如前所述匹配。在这种情况下,您将获得第一列作为匹配(出于历史原因)和该警告,因为这可能不是您想要做的。