У меня есть три объекта: 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);
Я не могу изменить сущности (кроме добавление новых конструкторов или методов), поскольку они используются в других местах и в других запросах.
Возможно ли это?