0

私は、多対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すべてのものを生成します...SCHOOLID

ラインで

student.getSchool()

私はこのすべてのデータを必要とせず、非常に長く、パフォーマンスを低下させているため、これは私を悩ませ50 fieldsますビューでオープンセッションを使用しているため、セッションを閉じず、MySQL 5 で Hibernate 4.2.3 を使用しています。

プロパティをパブリックとして宣言し、直接アクセスすることで目的の動作を得ることができましたが、もちろんそれは私が望むものではありません。

student.getSchool().setTeacherList=new java.util.LinkedHashSet<Teacher>(like.list());

私を助けてください。

4

1 に答える 1

0

解決

私は自分で学校のインスタンスを作成することにしました。非常に簡単です。休止状態からいくつかの利点が失われていることはわかっていますが、現時点では必要ありません。これが私の解決策です。誰かを助けることを願っています。

private void loadTeachersForSchool(final Session session,final Student student,Integer  schoolID)
{
   School school = new School(idSchool);
   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));                
   school.setTeacherList(new java.util.LinkedHashSet<Teacher>(like.list()));
   student.setSchool(school);
  return;
}

これはトリックを解決します..そして私はDBから学校をロードしません。

重要なポイントを確認してください。

School school = new School(idSchool);//create the school instance and and the teachers
school.setTeacherList(new java.util.LinkedHashSet<Teacher>(like.list()));
student.setSchool(school);//and add all to students
于 2013-07-17T01:38:51.723 に答える