Как выбрать атрибут Set <> в Entity с помощью CriteriaBuilder - PullRequest
0 голосов
/ 09 мая 2019

У меня есть этот объект:

public Entity {

    @JoinTable(name = "entity_equivalents",
            joinColumns = {
                @JoinColumn(name = "entity_new")},
            inverseJoinColumns = {
                @JoinColumn(name = "entity_old")})
    @OneToMany
    private Set<Entity> equivalents;

Я пытался создать CriteriaQuery, где я выбираю эквиваленты из сущности, я не могу понять, как создать CriteriaQuery

  public Set<Entity> findEquivalents(Entity p1) {
        EntityManager em = getEntityManager();
        CriteriaBuilder cb = em.getCriteriaBuilder();
    // HERE is the problem
        CriteriaQuery<Set<Entity>> query = cb.createQuery(); // <----
        Root<Entity> root = query.from(Entity.class);
        Expression<Set<Entity>> exx= root.get(Entity_.equivalents);
        query.select(exx); 
        query.where(cb.equal(root.get(Entity_.id), p1.getId()));
        return em.createQuery(query).getSingleResult();

    }

Я не хочу делать атрибут FetchType.EAGER или оставлять EM открытым и загружать загрузку при использовании экземпляра, например enti.getEquivalents();

Временное решение (пока кто-нибудь не поведет меня раскрыть тайны CriteriaQuery):

return new HashSet<>(getEntityManager()
.createQuery("SELECT o.equivalents from Entity o where o.id=" + id)
.getResultList());
...