JPA CriteriaBuilder JOIN не работает для коллекции - PullRequest
0 голосов
/ 22 июня 2019

У меня есть две сущности в отношениях один ко многим. Я пытаюсь присоединиться к коллекции сущностей, но не могу понять, как использовать фреймворк. Я всегда использовал DetachedCriteria hibernate, но это больше не вариант для меня, любая помощь будет здорово.

@Entity
@Table(name = "Project")
public class Project implements Serializable {
....
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "project")
    private Collection<WorkReport> workReportCollection;
....


@Data
@Entity
@Table(name = "work_report")
public class WorkReport implements Serializable {
    @JoinColumn(name = "id_work_report", referencedColumnName = "id_work_report", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Project project;

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

LazyInit Exception

при доступе к полю.

CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Project> query = builder.createQuery(Project.class);
        Root<Project> project = query.from(Project.class);
        Predicate idPredicate = builder.equal(project.get("idProject"), idProject);
        project.joinCollection("workReportCollection",  JoinType.LEFT);
        query.where(idPredicate);
        TypedQuery<Project> q = em.createQuery(query);
        return q.getSingleResult();

Единственное, что работает, - это использовать выборку вместо объединения, но она также извлекает все другие ассоциации, и это слишком много данных.

Как правильно написать объединение с JPA CriteriaBuilder? ИЛИ Должен ли я использовать выборку с какой-то проекцией?

1 Ответ

1 голос
/ 22 июня 2019

Соединение правильное, но коллекция не инициализируется при доступе к ней, поэтому вы получаете LazyInitException.

Вы должны добавить fetch:

project.fetch("workReportCollection");

, чтобы советовать JPA инициализироватьКоллекция после запроса.

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