Предположим, что мы должны получить список отчетов List<DerivativeNames>
(метод DerivativeNamesService # getDerivativeNames). И мы не можем вносить изменения в модель базы данных, и мы должны использовать существующие POJO. Как вы думаете, это лучший / более простой способ сделать это? Я имею в виду только один запрос JPQL, а не два ниже.
// Model entities
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "SURNAME")
private String surname;
// ...
}
@Entity
@Table(name = "NAME")
public class Name {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "BASE_FORM", nullable = false)
private String baseForm;
@Column(name = "DESCRIPTION", nullable = false)
private String description;
// ...
}
// POJO data for reports
public class PersonData {
private Long personId;
private String name;
private String surname;
public PersonData(Long personId, String name, String surname) {
this.personId = personId;
this.name = name;
this.surname = surname;
}
// ...
}
public class DerivativeNames {
private String basis;
private List<PersonData> personDataList = new ArrayList<>();
public DerivativeNames(String basis) {
this.basis = basis;
}
public String getBasis(){
return basis;
}
public void setPersonDataList(List<PersonData> personDataList){
this.personDataList = personDataList;
}
// ...
}
// Reports services
public class DerivativeNamesService {
private EntityManager em;
// ...
public List<DerivativeNames> getDerivativeNames() {
String queryString = "select new reports.DerivativeNames(n.baseForm) " +
"from Name n";
return em.createQuery(queryString, DerivativeNames.class)
.getResultList().stream()
.peek(this::setPersonDataListOf)
.collect(Collectors.toList());
}
private void setPersonDataListOf(DerivativeNames derivativeNames) {
String queryString = "select new reports.PersonData(p.id, p.name, p.surname) " +
"from Person p " +
"where p.surname like concat(:name, '%')";
List<PersonData> personDataList = em.createQuery(queryString, PersonData.class)
.setParameter("name", derivativeNames.getBasis())
.getResultList();
derivativeNames.setPersonDataList(personDataList);
}
// ...
}