解决它。主要错误是我错过了
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")));



