甚至在没有孩子的情况下也获取父项

问题描述 投票:0回答:1

经过无数次尝试,我在这里寻求大家的帮助。但是非常需要解决方案。

我有一个父(患者)实体及其子(地址)实体。我要获取所有已注册患者和地址的详细信息,其中地址详细信息可能为空。意思是,患者可能没有地址详细信息。

我已经使用CriteriBuilder编写了这样的逻辑

    CriteriaBuilder builder = this.em.getCriteriaBuilder();
    CriteriaQuery<Object[]> query = builder.createQuery(Object.class);

    Root<TaskImpl> patientRoot = query.from(Patient.class);
    Root<ContentImpl> addressRoot = query.from(Address.class);
    query.multiselect(patientRoot.get("patinetId"),patientRoot .get("patinetName"),
                       addressRoot.get("city));

    Predicate patAddressJoinPred = builder.equal(
            patientRoot.get("patientId"),
            addressRoot.get("patient").get("patientId"));


    query.where(builder.and(patAddressJoinPred));

请找到Patinet和地址实体供您参考,

Patient.java-----------------
@Entity
public class Patinet{
@Id
private Long patentId;
private String patientName;
}
------------------------------
Address.java------------------
@Entity
public class Address{
@Id
private Long addressId;
private String city;
@OneToOne(FetchType.Lazy)
@JoinColumn("patinet_id")
private Patient patient;
}
-------------------------------

但是在条件构建器之后,交叉连接应用于地址实体,这将是性能问题,我无法获得没有地址详细信息的患者详细信息。

为简单起见,下面给出了示例数据和所需的输出。

Patient table 
-------------
id | name
-------------
1  | Sameul
2  | Jhon
3  | khan
4  | Lee

-------------
Address table 
-----------------------
id | city  | patient_id
-----------------------
1  | Blz   |    1
2  | Stn   |    3

必填项

-------------------------
id |  patientName  | city
-------------------------
1  |   Sameul      | blz
2  |    Jhon       |
3  |    khan       | stn
4  |    Lee        |

但是变得像这样

-------------------------
id |  patientName  | city
-------------------------
1  |   Sameul      | blz
3  |    khan       | stn
-------------------------

将等待您有价值的解决方案谢谢..

经过无数次尝试,我在这里寻求大家的帮助。但是非常需要解决方案。我有一个父(患者)实体及其子(地址)实体。我想获取所有已注册的位置...

java hibernate spring-data-jpa jpa-2.0
1个回答
0
投票

[您似乎正在使用inner join,应该使用outer joins类似,

© www.soinside.com 2019 - 2024. All rights reserved.