2016-11-07 56 views
0

我有一個實體調用學生,其中包含與學生相關的幾個字段以及具有一對多關係的主題列表。在這裏,我需要獲取除「圖像」之外的所有字段,包括主題列表,因爲它使用更多的內存,需要很長時間才能檢索所有行。有人可以說如何創建Projection和條件來檢索這個沒有圖像字段的Student對象嗎?是否有像「AliasToBeanNestedResultTransformer」這樣的自定義結果轉換器?因爲這不適用於我的主題列表爲OneToMany關係的場景。Hibenrate +使用嵌套列表實體的投影和實體標準

@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屬性必須持有外鍵的名稱,這樣你就必須這樣做修正:

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

其次,YES你可以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

這工作,但我得到科目爲空。我應該把與每個學生相關的所有科目都拿來。 – Mohan

+0

所以你必須將它添加到你的投影中:'.add(Property.forName(「subjects」))' –

+0

添加了上述代碼。我看到學生對象返回,但所有的字段都有空值。那是我缺少的東西嗎? – 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

此外,乍一看,它似乎是從其他答案複製粘貼(我現在看到的差異)。也許值得注意的是爲什麼其他答案不適合你,以及爲什麼你做了你所做的改變。 –