我有两张桌子:
course: id, name
student: id, course_id, age
表与oneToMany批注绑定
我正在尝试编写一个针对课程的hibernate查询,该课程将返回x年0年级的课程和学生。这是我的尝试:
SELECT c from Course c RIGHT JOIN c.student p ON p.age = 20
它返回一个至少有一个学生为20的课程。当有更多学生不是20时,它们也包含在结果集中。有没有办法限制连接的表值?
编辑: 这些是我的实体:
public class Course implements Serializable {
private static final long serialVersionUID = 646349111982187812L;
@Id
@Column(name = "id", unique=true, nullable=false)
private String id;
@Column(name = "name", unique=false, nullable=false)
private String name;
@OneToMany(cascade={CascadeType.ALL, CascadeType.REMOVE},
fetch=FetchType.LAZY, mappedBy = "Course")
@OrderBy("age")
@JsonManagedReference
private Set<Student> students;
getters and setters ...
}
public class Student implements Serializable {
private static final long serialVersionUID = 646349221337813L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "age", unique=false, nullable=true)
private String age;
@ManyToOne()
@JsonBackReference
private Course course;
}
我试图从我的crudrepository中使用这个方法来获得预期的结果:
@Query(?????)
public List<Course> findCoursesWithAdults(@Param("age")int age)
答案 0 :(得分:1)
听起来你想要一个内连接而不是一个正确的连接
SQL
A
B
B
A
B
A
B
A
B
A
B
A
A
B
A
B
A
B
A
B
A
B
B
A
B
A
B
A
A
B
B
A
A
B
B
A
B
A
A
B
A
B
B
A
A
B
A
B
A
B
B
A
B
A
A
B
B
A
A
B
或使用hql
SELECT distinct c.* from Course c inner join Student p on (c.id=p.course_id and p.age=20)
为了获取您要求的信息,您必须使用@Where(“年龄= 20”)限制课程设置,或者只处理学生列表而不是课程。
select distinct c from Course c inner join c.student p with p.age=20
您可以通过学生对象上的任何一个getCourse方法引用附加的课程对象。您也可以在这里使用“分组依据”来帮助您订购。
或者您可以在休眠实体中使用过滤器...
select p from Course c inner join c.student p with p.age=20
还有一个编辑和即时完成...有另一种方法可以做到这一点,我没有提到..
选择包装器查询。
为您的课程和学生创建一个包装器对象
@Transient
public List<Students> getStudents(Integer age){
List<Students> tmp = new ArrayList<>();
for(Student s: getStudents())
if(s.getAge().equals(age))tmp.add(s);
return tmp;
}
public class CourseWrapper(){
private Course c;
private List<Students> p = new ArrayList<>();
....constructor ... getters ...setters
}
more info here
答案 1 :(得分:0)
SELECT c.name, s.id
FROM course c
INNER JOIN student s ON c.id = s.course_id
WHERE s.age = 20