Используйте критерии JPA для получения данных в объект с коллекцией вложенных объектов

#java #jpa #criteria

Вопрос:

У меня есть следующий иерархический класс данных.:

 @Entity
class C {
    Long id;  
    String name;

    @OneToMany(mappedBy = "c")
    @Fetch(value = FetchMode.SUBSELECT)
    Set<B> bs;

    //... Lots of other stuff
}

@Entity
class B {
    
    @ManyToOne
    private C c;

    @OneToMany(mappedBy = "b")
    @Fetch(value = FetchMode.SUBSELECT)
    private Set<A> as;

    //... Lots of other stuff
}

@Entity
class A {
    
    Long id;  
    String name;

    @ManyToOne
    private B b;

    //... Lots of other stuff
}
 

и некоторые «результирующие» классы:

 class SimpleA {
    Long id;
    String name;
}

class SimpleC {
    Long cId;
    String cName;

    List<SimpleA> as;
}
 

Поэтому я хочу запросить данные и преобразовать их в список SimpleC. Я использую критерии JPA, такие как sms —

 CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Object[].class);
Root<C> root = criteriaQuery.from(C.class);
Join<C, B> b = root.join("bs");
Join<B, A> a = b.join("as");
Query query = em.createQuery(criteriaQuery.select(criteriaBuilder.array(root.get("id"), root.get("name"), a.get("id"), a.get("name"))));
List resultList = query.getResultList();
 

а затем преобразуйте этот необработанный список в список C. Есть ли возможность получить его менее «низкоуровневым» способом? Я чувствую, что мне нужно изменить запрос, не могли бы вы подсказать мне, как именно?