Java 使用spring数据jpa和querydsl进行左连接
我正在使用spring数据jpa和querydsl,并被困在如何编写简单的nice查询来左键联接两个表的问题上。 假设我有一个项目实体和一个任务实体,在项目中定义了OneToMany关系,我想做如下事情:Java 使用spring数据jpa和querydsl进行左连接,java,spring,jpa,join,querydsl,Java,Spring,Jpa,Join,Querydsl,我正在使用spring数据jpa和querydsl,并被困在如何编写简单的nice查询来左键联接两个表的问题上。 假设我有一个项目实体和一个任务实体,在项目中定义了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.projec
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和QueryDSL谓词执行器。
这使我能够访问以下方法:
Page<T> findAll(com.mysema.query.types.Predicate predicate, Pageable pageable)
Page findAll(com.mysema.query.types.Predicate谓词,可分页)
我知道通过创建一个新的JPAQuery(entityManager)可以很容易地实现左连接。但我并没有向实体管理器显式地注入spring数据jpa。
有没有好的简单的方法用左连接构建谓词?
希望有人在这里有经验,并能给我一个例子。
多谢各位
弗雷。如果你想表达对任务的约束,那么你可以这样做
QProject.project.tasks.any().id.eq(searchTerm)
如果您想通过左联接来表示某些任务的预加载,那么不能通过谓词来表示。Querydsl中的谓词是一个布尔表达式,表示查询的where、join和having部分。您能用JPQL而不是SQL表达您需要的内容吗?我现在不确定您是否需要左连接进行加载或其他操作。Hi Timo,JPQL表达式按请求添加Hi Timo,感谢您的回复。您的意思是说any()只能提供约束,而不从外部表加载数据吗?是的,此解决方案仅对结果提供约束,不影响加载