2016-04-24 7 views
0

「学生」と1対多の関係を持つ「クラス」オブジェクトがあるとします。1対多の関連付けを使用して休止状態で1人の子供を選択する方法

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; 
} 

クラスごとに最大200kの「学生」が存在します。最初の生徒のみで「クラス」を取得したい。しかし、私がそうするとき、私はただ一つではなく "学生"のすべてで単一の "クラス"を得る。

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

は、これは年代の一つだけで、特定の「クラス」を取得するために休止状態にDBを照会する方法はあり、それは200K以上の「生徒」でDBを照会するために時間がかかりすぎるので、タイムアウトにDBを引き起こし"学生"はすべての200kを取得せず、DBはタイムアウトしないのですか?私はCriteriaでそれを行うことを好むでしょうが、もしそうでなければ、HQLでそうする方法がありますか?

+3

これは、「最初の生徒のみでクラス」を取得したいとは思っていません。これはセットとしてマッピングされ、セットは順序を保持しません。最初の生徒はどういう意味ですか?学生テーブルに注文を維持する列がありますか?解決策に関しては、あなたの関連付けを双方向にし、 'Class.class'の代わりに' Student.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'としてStudentに送信するには、 '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; } 

私は思いますこの方法で、特定の学生を検索する基準を使って1人の学生だけがリストを取得しますクラス

+0

最終的に更新を行い、選択をしたい場合は、1つの子を更新することができるようにデータを書き込むという選択肢が制限されますか? – user2719805

+0

@ user2719805しかし、Classエンティティにアクセスする学生を更新する必要はありません。 Madhusudana Reddy Sunnapuが述べたアプローチを適用する必要があるかもしれません。 – RubioRic

関連する問題