我正在使用 QueryDSL v4.1.4 进行此查询
root
我的代码生成此SQL
.select(/*many fields*/)
.from(_product)
.join(_event).on(_product.event.eq(_event))
.join(_customer).on(_event.customer.eq(_customer))
.leftJoin(_person).on(_customer.person.eq(_person))
.leftJoin(_organization).on(_customer.organization.eq(_organization))
.where(/*many filters*/)
但是我希望会生成此SQL(此SQL在我的DBMS中可以正常工作)
SELECT --many fields
FROM product t3
LEFT OUTER JOIN person t1 ON (t0.p_id = t1.p_id)
LEFT OUTER JOIN organization t2 ON (t0.o_id = t2.o_id),
event t4,
customer t0
WHERE --many filters
尝试执行查询时,会发生此异常
SELECT --many fields
FROM product t3,
event t4,
customer t0
LEFT OUTER JOIN person t1 ON (t0.p_id = t1.p_id)
LEFT OUTER JOIN organization t2 ON (t0.o_id = t2.o_id)
WHERE --many filters
修复它的想法失败
missing FROM-clause entry for table "t0" (customer)
子句上添加所有元模型(这会产生无用且非常繁琐的查询)from
试图强加其他连接,但结果却相同(缺少FROM子句)是否存在任何强制将联接应用于查询的顺序的方法?
答案 0 :(得分:0)
为什么在t3
或t4
上没有联接?我以为这会导致这些表的笛卡尔积。联接可能在WHERE
子句中,该子句在示例中未显示?如果是这样,为什么要混合使用ANSI SQL和非ANSI SQL,而不是执行FROM
子句中的所有联接?我不认为这是一个querydsl问题,而是您最好首先解决的SQL问题。
要生成问题中要求的SQL,这应该可以解决问题。但是,您应该重构查询以在FROM
子句中执行ANSI样式的连接,并且querydsl将“正常工作”。
.select(/*many fields*/)
.from(_product)
.from(_event)
.from(_customer)
.leftJoin(_person).on(_customer.person.eq(_person))
.leftJoin(_organization).on(_customer.organization.eq(_organization))
.where(/*many filters*/)
编辑
在评论中,Esvin指出了from
方法的varargs version,因此对from
方法的standard version的三个调用可以简化为一:.from(_product, _event, _customer)