在QueryDSL上缺少FROM

时间:2018-11-14 20:35:56

标签: querydsl

我正在使用 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子句

是否存在任何强制将联接应用于查询的顺序的方法?

1 个答案:

答案 0 :(得分:0)

为什么在t3t4上没有联接?我以为这会导致这些表的笛卡尔积。联接可能在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)