当前位置: 首页 > 知识库问答 >
问题:

来自QueryDSL上的缺失

萧琛
2023-03-14

我使用QueryDSL v4.1.4执行此查询

.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

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

但我预计会生成此SQL(此SQL在我的DBMS中运行良好)

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)

无法修复的想法

  • 从子句中添加上的所有元模型(这将产生无用且非常繁重的查询)
  • 我还使用fetchJoin()尝试强制一个连接到另一个,但结果是相同的(例外情况是缺少FROM子句)

是否存在强制对查询应用联接的顺序的方法?


共有1个答案

刘安志
2023-03-14
匿名用户

为什么t3t4上没有连接?我本以为这会导致这些表的笛卡尔乘积。也许连接在WHERE子句中,这在示例中没有显示?如果是这样,为什么要混合ANSISQL和非ANSISQL,而不是执行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指出< code>from方法有一个varargs版本,因此对标准版本的< code>from方法的三个调用可以减少为一个:< code >。来自(_产品,_事件,_客户)

 类似资料:
  • 所以我想在我的项目中使用投影bean来优化加载时间(以避免获得无用的数据……)。 我有两个实体:父母- 在我的数据库中,我有: 父 1 与子 1 和子 2 父母2机智的孩子 我想在一个请求中得到父母和孩子,所以首先我这样做了: 它发挥了巨大的作用,结果如下: 但我不想从子实体加载“其他属性”。因此,我使用子实体的投影 bean 执行了此查询: 通过这个查询,我可以完全控制要选择的属性。但当父级没有

  • 使用Query DSL和hibernate(Spring Data JPA)构建查询,如下所示 这里的逻辑很简单:如果有一个与某个人关联的银行帐户,则按银行ID过滤结果。 实体具有一个,它包含整数值。实体可能具有也可能没有

  • 我将JPA与Hibernate一起使用。

  • 然后,我尝试将qRolloutAdmin放在query.from(qRolloutAdmin)中,如下所示: 它似乎改善了一点,这一次的例外情况几乎相同,但在bts一号上: 因此,我删除了bts上的内部连接,以便将其放在构建器中: 但例外情况保持不变。 Edit2:我尝试用一个on()方法指定innerJoin,如2.1.8中所述。参考文档的一般用法部分: 并得到了异常: QueryDSL无法确定

  • null 类似于REST查询DSL 用于全文和结构化搜索的查询语言

  • 我希望创建使用Spring上下文和模拟存储库bean的测试。我使用的是Spring Boot 1.3。2.构建快照JUnit Mockito。 以下是我的测试配置类: 此配置的目的是将OfferPresository从Spring上下文中排除并对其进行模拟,由于此,我将能够编写使用Spring上下文和模拟数据库存储库的测试。 这是我的测试课: 测试和测试配置目录为: 我的应用程序配置和包含Offe