Hibernate 级联查询


实体:考试,成绩,学生,班级
关系:成绩与考试多对一,成绩与学生多对一,学生与班级多对一.
需求:要根据考试id和班级id查询学生成绩.

Score
@Entity
public class Score {

	private int id;

	private Student student;

	private Exam exam;

	private int score;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "studentid", referencedColumnName = "id")
	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	@ManyToOne
	@JoinColumn(name = "examid", referencedColumnName = "id")
	public Exam getExam() {
		return exam;
	}

	public void setExam(Exam exam) {
		this.exam = exam;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

}


Student
private int id;

	private Grade grade;

	private String name;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "gradeid", referencedColumnName = "id")
	public Grade getGrade() {
		return grade;
	}

	public void setGrade(Grade grade) {
		this.grade = grade;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}



Exam和Grade略

下面是查询代码.
ScoreDao:
@SuppressWarnings("unchecked")
	public List<Score> getList(int examid, int gradeid) {
		Criteria c = getSession().createCriteria(Score.class);
		c.setFetchMode("exam", FetchMode.JOIN);
		c.add(Restrictions.eq("exam.id", examid));
		c.createAlias("student.grade", "grade");
		c.add(Restrictions.eq("grade.id", gradeid));

		return c.list();
	}


需要注意的是.超过两级级联的时候,需要给一个别名.
即不能直接用student.grade.id,而需要c.createAlias("student.grade", "grade");先给student.grade定义别名(这里定义为grade)

猜你喜欢

转载自yang2617.iteye.com/blog/1637945