【发布时间】:2016-01-08 07:14:03
【问题描述】:
假设我们有以下领域对象(部分完成以减少代码)。
public class Student {
@OneToMany(mappedBy="student")
List<Assignment> assignments;
}
public class Assignment {
@ManyToOne
Student student;
@OneToOne
Implementation implementation;
}
public class Implementation {
@OneToOne
Assignment assignment;
@OneToMany(mappedBy="implementation")
List<Assessment> assessments;
}
public class Assessment {
@ManyToOne
Implementation implementation;
String grade;
}
所以我要执行的查询是"Select all students whose assignment implementation has been performed (not null) and has not been assessed at all (List<Assessment>#isEmpty())
所以我使用QueryDSL 并尝试使用以下查询来获取未完成作业的学生
public class MyService {
@Autowired
private StudentRepository studentRepository;
public Iterable<Student> foo() {
return studentRepository.findAll(
QStudent.student.assignments.any().implementation.isNotNull()
);
}
}
上面的查询似乎被忽略了。
然后我用下面的方法得到组合(implemented exercises and empty assessments)
studentRepository.findAll(
QStudent.student.assignments.any().implementation.isNotNull()
.and(QStudent.student.assignments.any().implementation.assessments.isEmpty())
);
同样,这没有区别。知道我做错了什么
【问题讨论】:
-
“并且上面的查询似乎被忽略了”是什么意思?即使不满足谓词,是否没有学生返回或全部返回?
-
所有学生即使不满足谓词也会返回
标签: spring spring-data spring-data-jpa querydsl