3
@Entity
public class doctor {
   @Id
   private int id;
   private String username;
   private String password;
   private String phone;
   private String email;

   @OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor")
   @Cascade(value = org.hibernate.annotations.CascadeType.ALL)
   private Collection<patient> patients = new ArrayList<patient>();
}

@Entity
public class patient {
   @Id
   private int id;
   private String name;
   private String surname;
   private String phone;
   private int systolic;
   private int diastolic;

   @ManyToOne
   private doctor doctor;
}

今のところ、私はこの基準で医師の情報のみを取得できます。

Criteria query = session.createCriteria(doctor.class);
query.createCriteria("patients", "p");
query.add(Restrictions.eq("p.phone", phone));
List<doctor> doctorList = (ArrayList<doctor>) query.list();

患者の電話番号、医師の情報、および一部の患者の情報を提供することで、休止状態の基準を取得するにはどうすればよいですか?

のようなもの:phone = 3423423424、そして答えは:

-------------医師の情報----------------------------------patientinfo (収縮期、拡張期)-----------------------

  1 "Dr dre" sdfssd 243242 drdre@gmail.com  160 170

160 170患者の情報はどこにありますか

基準がない場合、HQLを使用しますか?

4

4 に答える 4

2

あなたが欲しいのは次のとおりです。

Hibernate Criteria APIの場合:

Criteria query = sessionFactory.getCurrentSession().
createCriteria(Patient.class, "patient");
query.setProjection(Projections.projectionList().
add(Projections.property("patient.doctor")).
add(Projections.property("patient.systolic")).
add(Projections.property("patient.diastolic")));
query.add(Restrictions.eq("patient.phone", phone));
return query.list();

HQL(実際にはJPQLのみ)の場合:

select p.doctor, p.systolic, p.diastolic from Patient p where p.phone = ?1

結果で得られるのは、Typeの値ですList<Object[]>。また、クラスのフィールドに追加@Cascade(value=CascadeType.SAVE_UPDATE)します。doctorPatient

于 2012-08-24T19:56:28.957 に答える
1

クエリが医師情報のみを返す(患者情報は返さない)理由は、OneToManyリレーションの場合、デフォルトでFetchTypeがLAZYに設定されているためです。フェッチタイプをEAGERに指定すると、hibernateも患者を返します。

@OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor", fetch = FetchType.EAGER)
于 2012-08-24T17:55:55.960 に答える
1

双方向のマッピングがあるため、各医師から患者を取得でき、各患者から医師情報を取得できます。代わりに患者のリストが必要な場合は、医師のリストで患者の類似基準を作成するだけです。session.createCriteria(patient.class)、必要な制限付き。あなたはそれを熱心にする必要はありません。ほとんどの場合、熱心なフェッチは必要ありません。Hibernateセッションの外部でオブジェクトが必要になる場合は、コレクションまたはプロキシを初期化(Hibernate.initialize)する方がはるかに優れています。

ところで、Javaクラスに名前を付けるときはキャメルケースを使用してください。これは広く使用されている規則です。

于 2012-08-24T18:00:50.583 に答える
1

HibernateTemplateを使用している場合

String hql = "from Boo where id in (:listParam)";
String[] params = { "listParam" };
Object[] values = { list};
List boos = getHibernateTemplate().findByNamedParam(hql, params, values);

春のフォーラムから引用

于 2013-03-27T10:55:26.460 に答える