加入2列并在hibernate中只获得匹配的值

时间:2015-06-17 14:04:22

标签: sql hibernate jpa nhibernate hql

我有两张桌子:

 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)

2 个答案:

答案 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