Spring JPQL-Joins-MultipleTables和空ResultList

Spring JPQL-Joins-MultipleTables和空ResultList,spring,hibernate,spring-mvc,spring-boot,jpa,Spring,Hibernate,Spring Mvc,Spring Boot,Jpa,我在JPQL中有一个通过5个表的查询,但如果其中一个表为NULL,则整个查询将失败,resultList为空,并引发异常。另一方面,如果所有表都不包含null,那么它将按预期工作 如何实现它以将表不为null的所有对象和为null的对象返回为null?所以我会得到-Object1[],null,null,null,例如。。。而且不仅仅是空的结果列表。。。 非常感谢:) public List getAdditionalInformation(字符串ppin){ Query Query=em.cr

我在JPQL中有一个通过5个表的查询,但如果其中一个表为NULL,则整个查询将失败,resultList为空,并引发异常。另一方面,如果所有表都不包含null,那么它将按预期工作

如何实现它以将表不为null的所有对象和为null的对象返回为null?所以我会得到-Object1[],null,null,null,例如。。。而且不仅仅是空的结果列表。。。 非常感谢:)

public List getAdditionalInformation(字符串ppin){
Query Query=em.createQuery(“从患者p JOIN p.placements pl JOIN pl.room r中选择p、pl、r、d、do”
+“加入r.d部门加入d.doctors,p.pin=:ppin”);
setParameter(“ppin”,ppin);
返回query.getResultList();
}
@交易的
公共附加PD getAdditional(字符串PPN){
列表=hr.getAdditionalInformation(PPN);
AdditionalPD adp=新的AdditionalPD();
患者=空;
位置=空;
房间=空;
部门=空;
医生=空;
对于(对象[]对象:列表){
患者=(患者)对象[0];
placement=(placement)对象[1];
房间=(房间)对象[2];
部门=(部门)对象[3];
医生=(医生)对象[4];
}
adp.setPatientFirstName(patient.getFirstName());
adp.setPatientLastName(patient.getLastName());
adp.setAge(countAge(ppin));
adp.setFrom(placement.getFrom());
adp.setTo(placement.getTo());
adp.setRoomName(room.getName());
adp.setDepartmentName(department.getName());
adp.setDoctorFirstName(doctor.getFirstName());
adp.setDoctorLastName(doctor.getLastName());
返回adp;
}
@GetMapping(“/additional/pin/{ppin}”)
公共字符串附加信息(@PathVariable字符串ppin,模型){
AdditionalPD adp=has.getAdditional(ppin);
model.addAttribute(“adp”,adp);
返回“附加”;
}

使用
左连接
而不是
连接
。默认情况下,JPQL联接是
内部联接

public List<Object[]> getAdditionalInformation(String ppin) {
    Query query = em.createQuery("SELECT p, pl, r, d, do FROM Patient p JOIN p.placements pl JOIN pl.room r"
            + " JOIN r.department d JOIN d.doctors do where p.pin = :ppin");
    query.setParameter("ppin", ppin);

    return query.getResultList();
}

@Transactional
    public AdditionalPD getAdditional(String ppin) {
        List<Object[]> list = hr.getAdditionalInformation(ppin);

        AdditionalPD adp = new AdditionalPD();
        Patient patient = null;
        Placement placement = null;
        Room room = null;
        Department department = null;
        Doctor doctor = null;

        for(Object[] object : list) {
            patient = (Patient) object[0];
            placement = (Placement) object[1];
            room = (Room) object[2];
            department = (Department) object[3];
            doctor = (Doctor) object[4];
        }

        adp.setPatientFirstName(patient.getFirstName());
        adp.setPatientLastName(patient.getLastName());
        adp.setAge(countAge(ppin));
        adp.setFrom(placement.getFrom());
        adp.setTo(placement.getTo());
        adp.setRoomName(room.getName());
        adp.setDepartmentName(department.getName());
        adp.setDoctorFirstName(doctor.getFirstName());
        adp.setDoctorLastName(doctor.getLastName());

        return adp;
    }

@GetMapping("/additional/pin/{ppin}")
    public String additionalInformation(@PathVariable String ppin, Model model) {

        AdditionalPD adp = has.getAdditional(ppin);

        model.addAttribute("adp", adp);

        return "additional";
    }