JPA CriteriaBuilder JOIN无法用于收集

时间:2019-06-22 10:36:18

标签: jpa

我有两个实体,一对多。我正在尝试加入实体集合,但是无法使用它来使用框架。我一直使用hibernate的DetachedCriteria,但对我而言已不再是一种选择,任何帮助都将非常有用。

@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异常

访问该字段时。

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 个答案:

答案 0 :(得分:1)

联接是正确的,但是访问集合时未初始化该集合,这就是为什么会出现LazyInitException的原因。

您必须添加提取:

project.fetch("workReportCollection");

在查询后建议JPA初始化集合。