Запрос API Crieria с использованием критерияbuilder.construct с несуществующим отношением - PullRequest
0 голосов
/ 22 марта 2020

Учитывая это очень простое DTO:

@Entity
public class Employee implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

private String name;

@OneToOne
private Employee boss;

}

Я хотел бы сделать запрос, который собирает все имена сотрудников и идентификатор их босса, поместите в хороший чистый POJO:

public class EmployeeInfo {

private String name;
private Long bossId;

public EmployeeInfo(String name, Long bossId) {
    this.name = name;
    this.bossId = bossId;
}

}

Этот запрос должен быть полезен:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EmployeeInfo> query = cb.createQuery(EmployeeInfo.class);
Root<Employee> root = query.from(Employee.class);
query.select(
        cb.construct(EmployeeInfo.class,
                root.get("name").as(String.class),
                root.get("boss").get("id").as(Long.class)));
result = em.createQuery(query).getResultList();

Когда в столбце сотрудника присутствует bossId, это работает просто отлично. Но когда идентификатор босса не установлен, запись будет полностью проигнорирована. Итак, как мне трактовать это несуществующее отношение босса как ноль или 0 для конструкции / множественного выбора?

В чистом SQL это просто:

SELECT name, COALESCE(boss_id, 0) FROM EMPLOYEE;

Но ради любви к Богу я не могу сделать критерии API это сделать.

cb.construct(EmployeeInfo.class,
        root.get("name").as(String.class),
        cb.coalesce(root.get("boss").get("id").as(Long.class), 0L)));

1 Ответ

1 голос
/ 22 марта 2020

Проблема в том, что root.get("boss") генерирует запрос с перекрестным соединением, как это from Employee employee, Employee boss where employee.boss.id=boss.id. Поэтому записи, где employee.boss.id is null игнорируются.

Для решения проблемы следует использовать root.join("boss", JoinType.LEFT) вместо root.get("boss")

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