【问题标题】:Fetch Parent even when child is absent即使孩子不在,也可以获取父母
【发布时间】:2020-05-26 02:22:53
【问题描述】:

经过多次尝试,我在这里寻求你们中的任何人的帮助。非常需要一个解决方案。

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

我已经像这样使用 CriteriaBuilder 编写了逻辑

    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));

请为您的 ref 找到 Patient 和 Address 实体,

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】:

    看起来你正在使用inner join,你应该使用outer joins 类似的,

    final Root<Patient> patient = criteriaQuery.from(Patient.class);
    Join<Patient, Address> join1 = patient .join("joinColumnName", JoinType.LEFT);
    
    Predicate predicate = criteriaBuilder.equal(Address.<String> get("patient_id"), patient;
    criteria.add(predicate);
    criteriaQuery.where(predicate);
    criteriaQuery.distinct(true);
    

    希望它能解决您的问题。我尚未对其进行测试,但应该可以正常工作。

    【讨论】:

    • 不,没有帮助
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2015-08-30
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多