Учитывая это очень простое 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)));