【发布时间】:2016-02-25 07:02:07
【问题描述】:
我有两张桌子;
Create table Student (
id int NOT NULL AUTO_INCREMENT,
name varchar(35),
PRIMARY KEY (id)
);
Create table Course (
id int NOT NULL AUTO_INCREMENT,
student_id int,
name varchar(35),
PRIMARY KEY (id),
FOREIGN KEY (student_id)
REFERENCES Student(id)
ON DELETE CASCADE
);
查询:查找学生“John”上的所有课程。
Select C.name
FROM Course C
JOIN Student S
ON S.id=C.student_id
WHERE S.name='John';
如何用 JPA 查询语言编写这个?如何编写涉及两个这样的由外键关联的表的标准?
public List<Course> findCourseByStudentName(String name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Course> criteria = cb.createQuery(Course.class);
Root<Course> courseRoot = criteria.from(Course.class);
Join<Course,Student> courseStudent = courseRoot.join(Course_.student);
criteria.select(courseRoot).where(cb.equal(courseStudent.get(Student_.name), "John"));
}
编辑: 这是Student类,Student.java
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "name"))
public class Student implements Serializable {
@Id
@GeneratedValue
private Long id;
@NotNull
@Size(min = 1, max = 35)
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy="student")
Set<Course> courses;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setCourses(Set<course> courses) {
this.course = course;
}
public Set<Course> getCourses() {
return courses;
}
}
这是课程类,Course.java
@Entity
@Table
public class Course implements Serializable {
@Id
@GeneratedValue
private Long id;
@NotNull
@ManyToOne( targetEntity = Student.class )
@JoinColumn( name = "student_id", referencedColumnName = "id")
private Student student;
@NotNull
@Size(min = 1, max = 35)
private String name;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setStudent(String student) {
this.student = student;
}
public String getStudent() {
return student;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return Name;
}
}
【问题讨论】:
-
所以在 JPQL 中你做了一个“join”,所以也许在 Criteria 中做一个 join(...)。 datanucleus.org/products/accessplatform_4_2/jpa/…
-
谢谢。将研究这些文档。