TypedQuery <PojoType>- пример с полем List в PojoType - PullRequest
0 голосов
/ 09 февраля 2020

Предположим, что мы должны получить список отчетов 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);            
    }

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