【问题标题】:left join with spring data jpa and querydsl与 spring data jpa 和 querydsl 左连接
【发布时间】:2014-04-15 07:27:58
【问题描述】:

我正在使用 spring data jpa 和 querydsl 并被困在如何编写简单的好查询以左连接两个表。 假设我有一个 Project 实体和一个 Task 实体,在 Project 中定义了 OneToMany 关系,我想做这样的事情:

select * from project p left join task t on p.id = t.project_id where p.id = searchTerm
select * from project p left join task t on p.id = t.project_id where t.taskname = searchTerm

在 JPQL 中应该是:

select distinct p from Project p left join p.tasks t where t.projectID = searthTerm
select distinct p from Project p left join p.tasks t where t.taskName = searthTerm

我有一个 ProjectRepository 接口,它扩展了 JpaRepository 和 QueryDslPredicateExecutor。 这让我可以访问方法:

Page<T> findAll(com.mysema.query.types.Predicate predicate, Pageable pageable) 

我知道通过创建新的 JPAQuery(entityManager) 可以轻松实现左连接。但我没有实体管理器显式注入 spring data jpa。 有没有简单的方法来构建带有左连接的谓词? 希望这里有人经历过这种情况并能给我举个例子。 谢谢。

弗雷。

【问题讨论】:

  • 您能用 JPQL 而不是 SQL 来表达您的需求吗?我现在不确定你是否需要左连接来加载或其他东西。
  • 嗨 Timo,JPQL 表达式已按要求添加

标签: java spring jpa join querydsl


【解决方案1】:

如果你想表达对任务的约束,那么你可以这样做

QProject.project.tasks.any().id.eq(searchTerm)

如果你想通过左连接来表达某些任务的预加载,你不能通过谓词来表达。 Querydsl 中的谓词是一个布尔表达式,表示查询的位置、连接和部分。

【讨论】:

  • 嗨蒂莫,感谢您的回复。你的意思是any()只能提供约束,不从外表加载数据?
  • 是的,这个方案只对结果有一个约束,不影响加载
猜你喜欢
  • 2012-11-09
  • 2020-06-16
  • 2016-02-17
  • 2020-08-18
  • 2017-05-12
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多