gpt4 book ai didi

java - 缺少表别名,只能使用字段名称

转载 作者:行者123 更新时间:2023-11-30 06:30:47 25 4
gpt4 key购买 nike

我的 table

N
ID|T_ID
1|1
2|2

T
ID|NAME
1|T1
2|T2

使用如下表格

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));
}

它给出了歧义警告,但即使别名错误,仍然可以获得值。我希望它返回“null”,我想它会退回到仅使用字段名称。

知道如何在别名错误的情况下使用它来获取“null”吗?

编辑

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

我的表格如下

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

代码

//Input params
Long userId = 4L;
boolean includeModifiedUser = false;

User userTable = USER.as("userTable");
User modifiedUserTable = USER.as("modifiedUserTable");

SelectQuery selectQuery = create.selectQuery();
selectQuery.addFrom(userTable);

//In some cases I want to include the last modifier in the query
if (includeModifiedUser) {
selectQuery.addJoin(modifiedUserTable, JoinType.LEFT_OUTER_JOIN, modifiedUserTable.ID.eq(userTable.MODIFIED_USER_ID));
}

selectQuery.addConditions(userTable.ID.eq(userId));
Record record = selectQuery.fetchOne();

System.out.println(record.get(userTable.LAST_NAME)); //prints "test1"
System.out.println(record.get(modifiedUserTable.LAST_NAME)); //prints "test1", would expect null as modifiedUserTable is currently not joined

在 jooq 3.9.3 和 3.9.5 上测试

最佳答案

按设计工作

在 SQL 中,结果集中不存在限定的列名。相反,结果集(像任何其他表一样)具有一组列,并且每个列都有一个名称,由 jOOQ 的 Field.getName() 描述。现在,“不幸的是”,在顶级 SELECT 语句中,在所有 SQL 方言以及 jOOQ 中都允许有重复的列名。当您连接两个表并且两个表都有例如ID 列。这样,您就不必仅仅因为出现歧义而重命名每个列。

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

This will return:

  • A field that is the same as the argument field (by identity comparison).
  • A field that is equal to the argument field (exact matching fully qualified name).
  • A field that is equal to the argument field (partially matching qualified name).
  • A field whose name is equal to the name of the argument field.
  • null otherwise.

If several fields have the same name, the first one is returned and a warning is logged.

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

关于列匹配歧义的旁注

首先,您提到日志中存在“不明确的匹配”警告,但该警告随后消失了。该警告表明两列使用相同的 Field.getName(),但它们都不是前面所述的“完全”匹配。在这种情况下,您将获得第一列作为匹配项(出于历史原因),以及该警告,因为这可能不是您想要做的。

关于java - 缺少表别名,只能使用字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46178324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com