我是HQL的新手。这是一个mysql查询。我需要将其转换为HQL查询。请问有什么建议吗?
`SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM
STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID`
学生[ID,NAME,GRADE_ID,CLASS]
评分为[GRADE_ID,GRADE_NAME]
上述查询的结果集将类似于ID,NAME,GRADE_NAME,CLASS。
最终更新:
我有两张桌子STUDENT[ID, NAME, GRADE_ID, CLASS]
GRADE[GRADE_ID, GRADE_NAME]
使用SQL查询SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM
STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID
我曾经在SQL中使用新表STUDENT[ID, NAME, GRADE_NAME, CLASS]
。
对于此函数,没有输入,返回类型是列表(结果表的所有记录)
这就是我想在HQL or JPQL
中做的,如何获取对象列表,对象的属性是id,name,gradename,class。
如何使用HQL。
答案 0 :(得分:3)
你不会在Hibernate中这样做。使用hibernate的重点是你正在处理对象。
所以我猜你的学生班级会有一个成绩等级列表
@Entity
public class Student{
// accessors and id omitted
@OneToMany(mappedBy="student")
private List<Grade> grades;
}
@Entity
public class Grade{
// accessors and id omitted
@ManyToOne
private Student student;
}
您可以通过session.get()查找成绩,然后grade.getStudent()
访问该学生:
Grade grade = (Grade) session.get(Grade.class, gradeId);
Student student = grade.getStudent();
HQL查询是针对这些查找方法过于复杂的场景而设计的。
编辑:我刚才意识到问题被标记为jpa
。那么你当然不会使用HQL,而是使用JPQL。而且你也会使用这段代码:
Grade grade = entityManager.find(Grade.class, gradeId); // no cast needed with JPA 2
Student student = grade.getStudent();
编辑:根据您在评论中添加的要求,我将数据模型更改为类似的内容(ids省略):
@Entity
public class Student{
public List<Course> getCourses(){
return courses;
}
public void setCourses(List<Course> courses){
this.courses = courses;
}
@OneToMany(mappedBy="student")
private List<Course> courses;
}
@Entity
public class Course{
@ManyToOne(optional=false)
private Student student;
@ManyToOne(optional=false)
private Grade grade;
public void setStudent(Student student){
this.student = student;
}
public Student getStudent(){
return student;
}
public Grade getGrade(){
return grade;
}
public void setGrade(Grade grade){
this.grade = grade;
}
}
@Entity
public class Grade{
@OneToMany(mappedBy="grade")
private Set<Course> courses;
public void setCourses(Set<Course> courses){
this.courses = courses;
}
public Set<Course> getCourses(){
return courses;
}
}
我会这样查询:
Grade grade = entityManager.find(Grade.class, 1L);
List<Student> studentsWithThisGrade = new ArrayList<Student>();
for(Course course : grade.getCourses()){
studentsWithThisGrade.add(course.getStudent());
}
(但Grade可能不是实体,而是数值或枚举。)
事实证明,OP毕竟使用普通的休眠,没有JPA。因此,无论您何时看到entityManager.find()
,请将session.get()
替换为{{1}}: - )
答案 1 :(得分:0)
试试这个。
public List<Student> getByGradeId(EntityManager entityManager, Grade grade) {
Query query = entityManager.createQuery("from Student where grade=:grade");
query.setParameter("grade", grade);
return (List<Student>) query.getResultList();
}
你也需要一个try / catch。