В следующих примерах Person.picture помечен с помощью @ManyToOne(fetch = FetchType) .LAZY).
Если я просто загружаю объекты одного типа без каких-либо объединений, все работает отлично.
Код: Выделить всё
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(Person.class);
criteriaQuery.select(root);
TypedQuery typedQuery = this.entityManager.createQuery(query);
EntityGraph entityGraph = entityManager.createEntityGraph(Person.class);
entityGraph.addAttributeNodes("picture");
query.setHint("javax.persistence.loadgraph", entityGraph);
List result = typedQuery.getResultList();
Но когда я делаю несколько объединений, EntityGraph принимается а также проверено, но по каким-то причинам не применено:
Код: Выделить всё
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(DepartmentMember.class);
Join person = root.join("member", JoinType.INNER);
Join department = root.join("department", JoinType.INNER);
criteriaQuery.where(criteriaBuilder.equals(department.get("name"), "development"));
criteriaQuery.select(person);
TypedQuery typedQuery = this.entityManager.createQuery(query);
EntityGraph entityGraph = entityManager.createEntityGraph(Person.class);
entityGraph.addAttributeNodes("picture");
query.setHint("javax.persistence.loadgraph", entityGraph);
List result = typedQuery.getResultList();
Я попробовал другой подход, используя соединения fetch - и это работает . Нравится:
Код: Выделить всё
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(DepartmentMember.class);
Join person = root.join("member", JoinType.INNER);
person.fetch("picture");
Join department = root.join("department", JoinType.INNER);
criteriaQuery.where(criteriaBuilder.equals(department.get("name"), "development"));
criteriaQuery.select(person);
TypedQuery typedQuery = this.entityManager.createQuery(query);
List result = typedQuery.getResultList();
Кто-нибудь знает, в чем может быть причина того, что EntityGraph не работает при использовании объединений? Что-то не так в моем подходе к EntityGraph?
Подробнее здесь: https://stackoverflow.com/questions/791 ... with-joins
Мобильная версия