Java 带标准API的复杂请求
我正在实施某种学校逻辑。我有一份他通过的考试清单:Java 带标准API的复杂请求,java,spring,jpa,spring-data-jpa,criteria-api,Java,Spring,Jpa,Spring Data Jpa,Criteria Api,我正在实施某种学校逻辑。我有一份他通过的考试清单: @Entity @Getter @Setter public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "student_id") private Long id; @Column("name") private String name;
@Entity
@Getter
@Setter
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "student_id")
private Long id;
@Column("name")
private String name;
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
private List<Exam> exams;
}
应该实现的要点之一是按姓名和通过的考试搜索学生。前端有三个过滤器:学生姓名和考试分数。我正在使用criteriaapi来实现这个逻辑。这里的主要思想是创建一组规范,然后调用StudentRepository方法:
List<Student> findAll(Specification<Student> spec);
这是我在witch的帮助下试图实现这个逻辑的代码
private Specification<Student> participantByExam(final Integer mark) {
return Objects.nonNull(mark) ? (root, query, cb) -> {
final Subquery<Exam> subquery = query.subquery(Exam.class);
final Root<Exam> examRoot = subquery.from(Exam.class);
final Expression<Object> expression = cb.selectCase()
.when(cb.equal(root.join(Student_.exams).get(Exam.prePost), POST), cb.literal(POST))
.otherwise(cb.literal(PRE));
final Predicate predicate = cb.and(
cb.equal(examRoot.get(Exam_.student), root),
cb.equal(examRoot.get(Exam_.mark), mark),
cb.equal(examRoot.get(Exam_.prePost), expression)
);
query.distinct(true);
subquery
.select(root.join(Student_.exams))
.where(predicate);
return cb.exists(subquery);
} : null;
}
private Specification participantby考试(最终整数分){
返回对象。非空(标记)?(根、查询、cb)->{
最终子查询子查询=query.Subquery(Exam.class);
最终根examRoot=subquery.from(Exam.class);
最终表达式=cb.selectCase()
.when(cb.equal(root.join(Student_.tests).get(Exam.prePost),POST),cb.literal(POST))
.否则(cb.文字(前));
最终谓词=cb.and(
cb.equal(examRoot.get(考试学生),根),
cb.equal(examRoot.get(考试分数),mark),
cb.equal(examRoot.get(Exam.prePost),表达式)
);
query.distinct(true);
子查询
.select(root.join(学生考试))
.where(谓语);
返回cb.exists(子查询);
}:null;
}
我在这里遇到的问题是连接词的使用不正确:有一种连接词是指参加后测的学生和对他们的某个成绩有一定分数的学生。但我想接待那些有一定分数的考后考试的学生
你能帮我解释一下这么复杂的请求逻辑吗?或者为这个编写正确的SQL请求。这不是一个完成家庭作业的网站:(@PaulWasilewski,我已经发布了创建此逻辑的尝试,希望对您有所帮助
if(student has at least one Post Exam) {
for(Exam exam : student.exams) {
if(exam.mark == selectedMark && exam.prePost == POST){
*Current student is suitable*
}
}
} else {
for(Exam exam : student.exams) {
if(exam.mark == selectedMark && exam.prePost == PRE){
*Current student is suitable*
}
}
}
private Specification<Student> participantByExam(final Integer mark) {
return Objects.nonNull(mark) ? (root, query, cb) -> {
final Subquery<Exam> subquery = query.subquery(Exam.class);
final Root<Exam> examRoot = subquery.from(Exam.class);
final Expression<Object> expression = cb.selectCase()
.when(cb.equal(root.join(Student_.exams).get(Exam.prePost), POST), cb.literal(POST))
.otherwise(cb.literal(PRE));
final Predicate predicate = cb.and(
cb.equal(examRoot.get(Exam_.student), root),
cb.equal(examRoot.get(Exam_.mark), mark),
cb.equal(examRoot.get(Exam_.prePost), expression)
);
query.distinct(true);
subquery
.select(root.join(Student_.exams))
.where(predicate);
return cb.exists(subquery);
} : null;
}