У меня есть модель данных с клиентами, у каждого из которых есть n портфелей, которые, в свою очередь, имеют n инвестиций, которые отображаются как @ManyToMany и получают ленивую выборку.

У меня также есть DTO со следующими полями:

  • Имя Клиента
  • список имен портфолио

Можно ли написать один запрос JPQL, который создает DTO, используя выражение конструктора? В частности, как получить список имен портфелей в конструкторе DTO?

Будет ли неэффективно, если я вместо этого запрашиваю модели клиентов с портфелями и сам создаю DTO?

1
wannabeartist 9 Апр 2013 в 17:13

1 ответ

Лучший ответ

Вам придется сделать это самостоятельно, и, вероятно, это будет даже немного эффективнее, чем использование конструктора в JPQL, поскольку отражение не потребуется:

select c.name, p.name from Customer c left join c.portfolios

Затем переберите результаты и создайте свои результаты. Например:

Map<String, Result> results = new HashMap<String, Result>();
for (Object[] row : rows) {
    String customerName = (String) row[0];
    Result r = results.get(customerName);
    if (r == null) {
        result.put(customerName, new Result(customerName));
    }
    r.addPortfolio((String) row[1]);
}
Collection<Result> namesAndPortfolios = results.values();
2
JB Nizet 9 Апр 2013 в 17:28
Благодарность! Итак, в общем, использование выражений конструктора не более эффективно? Просто удобнее в простых случаях?
 – 
wannabeartist
9 Апр 2013 в 17:42
2
Он должен вызывать конструктор через отражение, поэтому я предполагаю, что он будет немного менее эффективным. Но разница в производительности незначительна по сравнению со временем, затраченным на выполнение запроса.
 – 
JB Nizet
9 Апр 2013 в 17:44