「学生」と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でそうする方法がありますか?
これは、「最初の生徒のみでクラス」を取得したいとは思っていません。これはセットとしてマッピングされ、セットは順序を保持しません。最初の生徒はどういう意味ですか?学生テーブルに注文を維持する列がありますか?解決策に関しては、あなたの関連付けを双方向にし、 'Class.class'の代わりに' Student.class'から条件を構築する必要があります。生徒を取得すると、クラスエンティティに移動できます。これが役立ちます。 –
あなたは正しく私はList not Setを使用しなければなりません。しかし、双方向の関連付けを行い、Student.classから基準を作成する方法の例を教えてください。 – user2719805
[ここ](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から条件を作成します。 –