【发布时间】:2020-11-08 16:30:44
【问题描述】:
我需要使用 JPA 标准构建器创建以下 SQL 连接条件,
SELECT * FROM student s1
INNER JOIN
(SELECT subject,teacher,MIN(marks) AS marks FROM student GROUP BY subject, teacher) s2
ON s1.subject = s2.subject
AND s1.teacher = s2.teacher
AND s1.marks = s2.marks
下面是实体类和 JPA 查询构建器。
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="id")
Long id;
@Column(name="name")
String name;
@Column(name="subject")
public
String subject;
@Column(name="teacher")
String teacher;
@Column(name="marks")
String marks;
@JsonIgnore
@ManyToOne
@JoinColumns({
@JoinColumn(insertable=false, updatable=false, name="subject",referencedColumnName="subject"),
@JoinColumn(insertable=false, updatable=false, name="teacher",referencedColumnName="teacher"),
@JoinColumn(insertable=false, updatable=false, name="marks",referencedColumnName="marks")
})
Student studentSelf;
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy="studentSelf")
Set<Student> studentref;
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> query = cb.createQuery(Student.class);
Root<Student> mainStudent = query.from(Student.class);
List<Predicate> predicates = new ArrayList<>();
Join<Student, Student> studentJoin = mainStudent.join("studentSelf", JoinType.INNER);
List<Student> list = entityManager.createQuery(query).getResultList();
我可以使用连接条件构建查询,但无法创建内部 SELECT 查询。如何为联接子句创建内部选择查询?
需求说明:下面是所需的输入表和输出。
【问题讨论】:
-
一种方法可能是使用
WHERE子句中的相关子查询重写查询以检查最小标记值。 -
但我正在尝试根据教师和科目的独特组合提取最低分数。相关子查询可能会满足此要求。
-
我正在尝试了解您的模型和查询的目的,以便可以以不同的方式重新编写它。并且
studentSelf不是@ManyToOne关系(即subject、teacher和marks不能唯一识别学生)。如果您想将studentRef(代表classmates)保持为单向@OneToMany -
@KavithakaranKanapathippillai,要求是提取每个科目和教师组合的最低分数。我在查询中添加了要求。
标签: sql spring-boot spring-data-jpa criteria-api self-join