【发布时间】:2017-09-12 13:54:41
【问题描述】:
我的桌子
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 上测试
【问题讨论】:
-
确切的警告是什么?还有,这两个表的描述真的完整吗?
-
当我第一次写这个问题时,我也得到了
org.jooq.impl.Fields: Ambiguous match found for ...,但现在无法重现。问题本身仍然存在。 -
我的猜测是当它无法解析表格时,它会退回到仅进行字段比较并导致检索错误数据。