【问题标题】:How to construct multiple inner joins through relations in QueryDSL - Referring to intermediate tablesQueryDSL中如何通过关系构造多个内连接——参考中间表
【发布时间】:2018-12-31 20:17:14
【问题描述】:

我在构建将QueryDSL 中的内部联接组合在一起的查询时遇到问题,其中表不在

A --> B --> C 

关系,而是

A --> B <-- C

这是我的 SQL 查询

select s.* from sales s
inner join branch b on b.id = s.branch_id
inner join manager m on m.branch_id = b.id and m.name = 'Alice';

(摘自我这里的示例:https://www.db-fiddle.com/f/r5uvEsivyAhrP6KSpwJxBA/1)

所以对于我的 QueryDSL 等价物,我有:

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( ??? )

我不知道如何构造下一个内连接。

我尝试过的所有事情都给了我例外,例如Path expected for join!

假设,如果它是一对一的,我可以像这样链接......

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( QBranch.manager, QManager ).on(QManager.name.eq('Alice'));

但我没有那种关系。

我在 QueryDSL 中找不到合适的构造来对此进行建模,但我假设它是可能的?

【问题讨论】:

  • 我想我错过了这个问题。为什么正常模式不能这样工作? query() .select() .from(sales) .innerJoin(branch).on(branch.id.eq(sales.id)) .innerJoin(manager).on(manager.branchId.eq(branch.id)。 and(manager.name.eq("Alice"))); (显然在 select 调用中选择你想要的)
  • org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!

标签: querydsl


【解决方案1】:

我通常会调制一些样品,然后找到合适的组合。

此解决方案依赖于在 B 和许多 C 之间具有 ManyToOne 映射

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( QBranch.managers, QManager )
       .on(QManager.name.eq('Alice'));

managers 在分支中列出,QueryDSL 知道该做什么,并生成适合我的 SQL。

我仍然不知道如何解决这个问题,因为没有映射管理器。

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2011-05-18
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多