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 ,然后 answear 是:

-------------医生信息----------------------------------患者信息(收缩压、舒张压)-----------

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

160 170患者信息在哪里

如果没有标准,使用 HQL?

4

4 回答 4

2

您想要的是以下内容。

使用休眠标准 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

你有双向映射,所以你可以从每个医生那里得到他的病人,从每个病人那里你可以得到他的医生信息。如果您需要一个包含患者的列表而不是医生列表,只需为患者创建类似的标准。session.createCriteria(patient.class),有必要的限制。你不必急于求成。在大多数情况下,我们不需要急切的获取。如果您需要休眠会话之外的对象,最好初始化(Hibernate.initialize)集合或代理。

顺便说一句,当您命名 java 类时使用驼峰式大小写。这是广泛使用的约定。

于 2012-08-24T18:00:50.583 回答
1

您的查询仅返回医生信息(而不是患者信息)的原因是因为对于 OneToMany 关系,FetchType 默认设置为 LAZY,如果您将 fetch 类型指定为 EAGER,hibernate 也会返回患者。

@OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor", fetch = FetchType.EAGER)
于 2012-08-24T17:55:55.960 回答
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 回答