Вызовите родителя, даже если ребенок отсутствует - PullRequest
0 голосов
/ 10 февраля 2020

После многих попыток я здесь, чтобы обратиться за помощью к любому из вас. Решение очень необходимо.

У меня есть родительская (терпеливая) сущность и ее дочерняя (адресная) сущность. Где я хочу получить все зарегистрированные пациенты и адресные данные, где адресные данные могут быть нулевыми. Это означает, что у пациента может не быть информации об адресе.

Я написал логи c, используя 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));

. Пожалуйста, найдите сущности пациента и адреса для вашей ссылки,

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

Будем ждать вашего ценного решения Спасибо ..

1 Ответ

0 голосов
/ 10 февраля 2020

Похоже, вы используете 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);

Надеюсь, это решит ваш запрос. Я не проверял это, но должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...