Проекция данных в формате jpa для запроса данных с соединениями - PullRequest
0 голосов
/ 25 мая 2018

Я бы хотел оптимизировать запрос dataDSL + Spring.В настоящее время я использую BooleanBuilder в качестве предиката, что было бы хорошо, но он объединяет слишком много таблиц.Мне не нужны все столбцы из таблиц, и мне не нужны некоторые таблицы вообще.Я считаю, что использование проекции уменьшит количество объединяемых таблиц.

Я пробовал использовать Projection.bean (), а также расширить MappingProjection, но оба подхода приводят к тому, что не используются объединения, а выбирается из нескольких таблиц, что приводит кв меньшем количестве строк, чем необходимо.

Моя структура данных состоит из сущности Booking и некоторых связанных объектов, таких как User, поэтому выглядит примерно так:

@Entity
public class Booking {

    @ManyToOne
    @JoinColumn(name = "userId", nullable = false)
    private User endUser;
}

@Entity
public class User {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "endUser", fetch = FetchType.LAZY)
    private List<Booking> bookings;
}

Я реализовал собственную проекцию queryDSLрепозиторий, как описано здесь: Spring Data JPA и Querydsl для выборки подмножества столбцов с использованием проекции bean / constructor

Я пробую проекцию, подобную следующей:

Projections.bean(Booking.class,
                 booking.uuid,
                 Projections.bean(User.class,
                                  booking.endUser.uuid
                 ).as(booking.endUser.getMetadata().getName()
);

SQL, сгенерированный текущим решением, выглядит примерно так:

select (...)
from booking booking0_, 
     user user12_
where booking0_.user_id=user12_.id

Итак, как я могу заставить QueryDSL объединять таблицы, а не выбирать из них всех?Я на правильном пути, чтобы попытаться оптимизировать запрос?Имеет ли смысл проекция?

1 Ответ

0 голосов
/ 24 июля 2018

Я закончил тем, что создал представление БД, создал для него Entity, а затем запросил его с помощью querydsl.Это действительно просто, просто и производительность тоже хорошая.

Вероятно, в этом случае ORM просто не способны.

...