Восстановите список сущностей со связанными сущностями, пропустив некоторые поля с использованием JPQL или критериев API - PullRequest
0 голосов
/ 24 марта 2020

У меня есть три объекта: A, B, C

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class A {

    private long id;

    private String secret;

    @Builder.Default
    @Valid
    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<B> bList = new LinkedList<>();

}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class B {

    @JoinColumn
    private A a;

    private long id;

    private String secret;

    @Builder.Default
    @Valid
    @OneToMany(mappedBy = "b", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<C> cList = new LinkedList<>();

}


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class C {

    @JoinColumn
    private B b;

    private long id;

    private String secret;
}

Я хотел бы восстановить значения из БД ИСКЛЮЧИТЬ"секрет", где идентификатор A принадлежит списку идентификаторов. Я не хочу запрашивать секрет A, B или C из БД . (на самом деле данные намного сложнее, а поля, которые я не хочу, занимают слишком много времени, чтобы извлечь их из базы данных).

Я пытался создать такой запрос с использованием JPQL или API критериев, но без успеха я не могу получить даже список B без секретов.

Например, в JPQL:

        Query query = entityManager.createQuery
                ("SELECT a  " +
                        "FROM A a where a.id in :aIds");
        query.setParameter("aIds", aIds);

Это будет работать, но, к сожалению, это также требует секрет A, B и C.

То, что я хочу вместо этого, было бы чем-то вроде (этот код, очевидно, не работает):

        Query query = entityManager.createQuery
                ("SELECT a.id, a.bList.id, a.bList.cList.id" +
                        "FROM A a where a.id in :aIds");
        query.setParameter("aIds", aIds);

Я не могу изменить сущности (кроме добавление новых конструкторов или методов), поскольку они используются в других местах и ​​в других запросах.

Возможно ли это?

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете создать dto класс с нужными вам полями и заполнить его. Проблема в том, что запрос к базе данных может возвращать только простой результат. Постоянный провайдер может преобразовать его в сущности. Что касается dto, то вы должны решить проблему самостоятельно.

Вы можете получить List<Object[]> в качестве результата запроса

select a.id, b.id, c.id 
from A a join a.bList b join b.cList c 
where a.id in(:aIds)

Затем вы должны преобразовать результат запроса в dto

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