左加入弹簧数据 jpa 和 querydsl

2022-09-04 22:21:29

我正在使用spring data jpa和querydsl,并被困在如何编写简单漂亮的查询来左连接两个表。假设我有一个项目实体和一个任务实体,在项目中定义了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)轻松实现。但是我没有实体管理器明确注入弹簧数据jpa。有没有一种很好和简单的方法来构建一个带有左联接的谓词?希望这里有人经历过这种情况,并能够给我一个例子。谢谢。

弗雷。


答案 1

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

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

如果要通过左联接来表示某些任务的预加载,则无法通过谓词来表示。Querydsl 中的谓词是 where、join-on 和具有部分查询的布尔表达式。


答案 2

推荐