如何使用HibernateHQL或标准内部连接两个表?

3vpjnl9f  于 2021-07-09  发布在  Java
关注(0)|答案(7)|浏览(536)
@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();

我如何通过给病人电话、他的医生信息和一些病人信息来检索hibernate标准?
例如:phone=342342344,那么answear是:

5rgfhyps

5rgfhyps1#

如果您使用的是hibernatetemplate

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

引自 Spring 论坛

gc0ot86w

gc0ot86w3#

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

iovurdzv

iovurdzv4#

你想要的是以下内容。
使用hibernate标准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

结果中得到的是类型的值 List<Object[]> . 同时添加 @Cascade(value=CascadeType.SAVE_UPDATE)doctor 你的场地 Patient 班级。

sf6xfgos

sf6xfgos5#

查询只返回医生信息(而不返回患者信息)的原因是,对于onetomany关系,fetchtype默认设置为lazy,如果指定fetch type为eager,hibernate也会返回patients。

@OneToMany(targetEntity = patient.class, cascade = CascadeType.ALL, mappedBy = "doctor", fetch = FetchType.EAGER)
8aqjt8rx

8aqjt8rx6#

你有双向Map,所以从每个医生你可以得到他的病人,从每个病人你可以得到他的医生信息。如果你需要一份病人名单,而不是一份医生名单,只需为病人创建类似的标准。 session.createCriteria(patient.class) ,有必要的限制。你不必急着去做。在大多数情况下,我们不需要急于抓取。如果您需要hibernate会话之外的对象,那么最好初始化(hibernate.initialize)集合或代理。
顺便说一句,命名java类时使用camel case。这是广泛使用的惯例。

mnemlml8

mnemlml87#


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

哪里 160 170 病人的信息
如果不符合标准,是否符合hql?

相关问题