比方说,我有两个实体User和Task,每个用户可以有一个任务。
我面临的问题是,如果用户表中有一条记录,其电子邮件以a
开头,而任务表中根本没有记录。
下面的代码段将不返回任何记录,尽管我希望用户的邮件以a
开头。
示例中的UserRepository扩展了QuerydslPredicateExecutor。
userRepository.findAll(
QUser.user.email.startsWith("a")
.or(QUser.user.task.text.contains("something"))
)
如果我检查日志,则Hibernate将使用user.task_id=task.id
创建交叉联接,作为where子句的一部分。如果用户未分配任务,则这种类型的联接会自动丢弃其邮件以a
开头的用户。
在存储库的findAll方法中是否有一种方法可以强制使用左联接而不是交叉联接?
我知道我可以使用JPAQuery
来做到这一点,但随后我将不得不重新实现分页功能...
JPAQuery query = new JPAQuery(entityManager);
query
.from(QUser.user)
.leftJoin(QTask.task)
// ...