2016-04-24 41 views
0

假設我有一個「類」對象,它與「學生」具有一對多的關係。如何在一對多關聯中選擇一個冬眠兒童

public class Class implements java.io.Serializable { 

private String classId; 
private List<Student> student; 

public Class() { 
} 

public Class(String classId) { 
    this.classId = classId; 
} 


@Id 

@Column(name = "CLASS_ID", unique = true, nullable = false, length = 10) 
public String getClassId() { 
    return this.classId; 
} 

public void setClassId(String classId) { 
    this.classId = classId; 
} 


@OneToMany(fetch = FetchType.EAGER, mappedBy="classId") 
public List<Student> getStudent() { 
    return student; 
} 

每班最多可以有20萬「學生」。我只想找到一個只有第一個學生的「班級」。但是當我這樣做的時候,我會得到一個單獨的「班級」,而不是隻有一個「學生」。

criteria = session.createCriteria(Class.class, "class").add(Restrictions.eq("class.classId", "0002")).setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

這將導致DB超時,因爲時間太長查詢數據庫擁有超過20萬的「學生」有沒有一種方法來查詢數據庫在Hibernate中檢索特定的「類」只有一個的很「學生」沒有檢索所有200k,所以DB不超時?我更喜歡用Criteria這樣做,但如果不是的話,有沒有辦法通過HQL來實現?

+3

這並不清楚'想要檢索一個「類」只有它的第一個學生'。它被映射爲一個Set和Set不保持任何順序。第一個學生是什麼意思?學生表中是否有任何欄目維持秩序?關於解決方案,請將您的關聯設爲雙向關聯,並且您需要從'Student.class'而不是'Class.class'構建標準。一旦你得到學生,你可以導航到類實體。這應該有所幫助。 –

+0

你說得對,我應該使用List not Set。但是,你能舉一個例子說明如何從Student.class中進行雙向關聯和構建標準? – user2719805

+1

按照[此處](https://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch07.html#collections-bidirectional)所述進行雙向製作後,添加「idx」字段作爲'OrderColumn'的學生,你可以使用'session1.createCriteria(MyStudent.class,「s」)。createAlias(「s.myClass」,「c」).add(Restrictions.eq(「c.id」,「 1))。add(Restrictions.eq(「s.idx」,1))。setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);'從Student.class構建條件,作爲示例。 –

回答

1

我一直在閱讀這個非常有趣的文章關於這個問題的

http://www.theotherian.com/2013/07/hibernate-joins-maxresults.html

在那篇文章中所提出的解決方案應用到你的問題:

// works with FetchType.LAZY and FetchType.EAGER 
@OneToMany(fetch = FetchType.LAZY) 
@JoinColumn(name = "CLASS_ID") 
@Fetch(FetchMode.SELECT) 
@BatchSize(size = 1) 
private List<Students> students; 

public List<Students> getStudents() { return students; } 
public void setStudents(List<Students> students) { this.students = students; } 

我想通過這種方式,您將獲得一份只有一名學生使用您的標準檢索特定的列表類

+0

這是否會限制我填充數據的選項,只有在我希望最終能夠更新以及選擇時才能更新一個孩子? – user2719805

+0

@ user2719805但是,您不必更新學生訪問Class實體。也許你必須運用Madhusudana Reddy Sunnapu所說的方法。 – RubioRic