2016-11-07 8 views
0

私は、studentに関連するフィールドがほとんどなく、oneToMany関係のSubjectのリストを持つエンティティコールを持っています。ここでは、すべての行を取得するのに長い時間がかかる、より多くのメモリを使用するため、「イメージ」以外の件名リストを含むすべてのフィールドを取得する必要があります。画像フィールドだけを使わずにこのStudentオブジェクトを取得するための投影法と基準を作成する方法を言う人がいますか? "AliasToBeanNestedResultTransformer"のようなカスタム結果トランスフォーマがありますか?これは私がOneToMany関係としてSubjectのListを持っている私のシナリオではうまくいきません。第二にHibernate + Projectionとネストされたリストエンティティを持つエンティティの基準

@OneToMany(mappedBy="student", cascade = CascadeType.ALL, orphanRemoval=true) 
private List<Subject> subjects; 

YES、:あなたはこの修正を行う必要があるでしょうので

@Entity 
@Table(name="STUDENT") 
public class Student { 
    @id 
    private long studentId; 
    private String name; 
    private String dob; 
    private int age; 

    @Lob 
    private byte[] image; 

    @Lob 
    private byte[] imageTnail; 

    @OneToMany(mappedBy="subject", cascade = CascadeType.ALL, orphanRemoval=true) 
    private List<Subject> subjects; 

    //setter & getter... 
} 



@Entity 
@Table(name="SUBJECT") 
public class Subject { 

    @id 
    private long subjectId; 
    private String subjectName; 

    @ManyToOne 
    @JoinColumn(name="studentId") 
    private Student student; 
} 

編集

List<Student> results = getSession().createCriteria(Student.class) 
      .setProjection(Projections.projectionList() 
       .add(Property.forName("studentId")) 
       .add(Property.forName("name")) 
       .add(Property.forName("dob")) 
       .add(Property.forName("age")) 
      ).setResultTransformer(Transformers.aliasToBean(Student.class)).list(); 


    System.out.println("StudentDaoImpl.getStudents()"+results.get(0).getName()); 

答えて

0

は、まず、mappedBy属性は外部キーの名前を保持しなければなりませんあなたは画像を取得せずに学生のリストをretieveすることができます

List<T> results = session.createCriteria(Student.class) 
    .setProjection(Projections.projectionList() 
     .add(Property.forName("studentId")) 
     .add(Property.forName("name")) 
     .add(Property.forName("dob")) 
     .add(Property.forName("age")) 
    ) 
    .setResultTransformer(Transformers.aliasToBean(Student.class); 
    .list(); 

あなたが特定の学生に

List<T> results = session.createCriteria(Student.class) 
     .setProjection(Projections.projectionList() 
      .add(Property.forName("studentId")) 
      .add(Property.forName("name")) 
      .add(Property.forName("dob")) 
      .add(Property.forName("age")) 
     ).add(Restrictions.eq("studentId", @idAsParam)) 
     .setResultTransformer(Transformers.aliasToBean(Student.class); 
     .list(); 

を取得したい場合は、最初のオブジェクトは、オブジェクトを保持します。

+0

これは動作しますが、私がnullなどの科目を取得しています。私はすべての科目を各生徒に関連付けるべきです。 – Mohan

+0

あなたの投影に追加する必要があります: '.add(Property.forName(" subjects "))' –

+0

上記のコードを追加しました。私は生徒オブジェクトが返されたのを見ていますが、すべてのフィールドにはnull値があります。それは私が行方不明であるか? – Mohan

1

は、このソリューションをお試しください:

List<T> results = session.createCriteria(Student.class) 
    .setProjection(Projections.projectionList() 
     .add(Property.forName("studentId"),"studentId") 
     .add(Property.forName("name"),"name") 
     .add(Property.forName("dob"),"dob") 
     .add(Property.forName("age"),"age") 
    ).add(Restrictions.eq("studentId", @idAsParam)) 
    .setResultTransformer(Transformers.aliasToBean(Student.class); 
    .list(); 
+0

このコードは質問に答えるかもしれませんが、どのようにして問題を解決するか、そして/または理由を解決するための追加のコンテキストを提供すると、回答の長期的価値が向上します。 –

+1

さらに、一見したところで、それは他の回答からのコピー貼り付けのように思えます(私は現在の違いを見ています)。おそらく、他の回答があなたのためにうまくいかなかった理由と、なぜあなたが行った変更を行ったのかを書き留めることは価値があるかもしれません。 –

関連する問題