私は、多対1の関係である学校と学生の関係で、休止状態で何人かの学生を取得しようとしています。後で、生徒が所属する学校の教師を取得しようとしています..
ここに私のコードがあります
public ArrayList<Student>search(Date dateBorn)
{
Session session = currentSession();
Criteria criteria = session.createCriteria(Student.class).add(prepareForSelect()).setFetchMode("school",FetchMode.JOIN);
criteria.add(Restrictions.ge("age",dfrom))
.setProjection(addProjection("id","name","lastname","phone","school"))// the only data i need
.setResultTransformer(transformer(Student.class));
ArrayList<Student>students= new ArrayList<Student>(criteria.list());
if (!students.isEmpty())
for (Student student:students) loadTeachersForSchool(session,student,student.getSchool().getId());
return students;
}
private void loadTeachersForSchool(final Session session,final Student student,Integer schoolID)
{
Criteria like = session.createCriteria(Teacher.class).add(prepareForSelect().
add(Restrictions.eq("School.id",schoolID)))
.setProjection(addProjection("id","name","lastname"))//// the only data i need
.setResultTransformer(transFormer(Teacher.class));
student.getSchool().setTeacherList(new java.util.LinkedHashSet<Teacher>(like.list()));
return;
}
あなたが見ることができるように、すべてが魅力のように機能します
後で、このコードを使用して教師を学校に設定しようとすると:
student.getSchool().setTeacherList(new java.util.LinkedHashSet<Teacher>(like.list()));
return;
休止状態は、私が必要とする唯一のものであるため、その上にロードするSELECT
すべてのものを生成します...SCHOOL
ID
ラインで
student.getSchool()
私はこのすべてのデータを必要とせず、非常に長く、パフォーマンスを低下させているため、これは私を悩ませ50 fields
ますビューでオープンセッションを使用しているため、セッションを閉じず、MySQL 5 で Hibernate 4.2.3 を使用しています。
プロパティをパブリックとして宣言し、直接アクセスすることで目的の動作を得ることができましたが、もちろんそれは私が望むものではありません。
student.getSchool().setTeacherList=new java.util.LinkedHashSet<Teacher>(like.list());
私を助けてください。