我有两个实体,一对多。我正在尝试加入实体集合,但是无法使用它来使用框架。我一直使用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正确编写联接?还是我应该对某些投影使用提取?
答案 0 :(得分:1)
联接是正确的,但是访问集合时未初始化该集合,这就是为什么会出现LazyInitException的原因。
您必须添加提取:
project.fetch("workReportCollection");
在查询后建议JPA初始化集合。