修复。主要的错误是我错过了on
左连接中的子句,但为了表达on
条件是我必须更加小心地命名子查询。该文档对构建访问子查询结果的路径进行了一些介绍,因此这里是示例。
联合中的第一个查询设置列名称:
SQLSubQuery subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).join(t.fk462bdfe3e03a52d4, QClient.client);
ListSubQuery clientByPaid = subQuery.list(t.id.as("id"), t.paidId.as("clientid"),
QClient.client.name.as("clientname"));
subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).where(t.paidId.isNull(), t.clientname.isNotNull());
ListSubQuery clientByName = subQuery.list(t.id, Expressions.constant(-1L),
t.clientname);
我现在需要构建一个路径表达式来引用我的内部查询。对于路径使用哪个类似乎并不重要,因此我选择了 Void 来强调这一点。
subQuery = new SQLSubQuery();
Path innerUnion = Expressions.path(Void.class, "innernamequery");
subQuery = subQuery.from(subQuery.union(clientByPaid,clientByName).as(innerUnion));
以及进一步的路径表达式来表达on
条款。请注意,我加入了list()
联合查询的每一列都使用innerUnion
之前定义的路径。
Path namequery = Expressions.path(Void.class, "namequery");
query = query.leftJoin(subQuery.list(
Expressions.path(Long.class, innerUnion, "id"),
Expressions.path(Long.class, innerUnion, "clientid"),
Expressions.stringPath(innerUnion, "clientname")),
namequery)
.on(t.id.eq(Expressions.path(Long.class, namequery, "id")));