Hibernate Query Collection 也有一个映射实体

Hibernate Query Collection which also has a mapped entity

工作实体

 @ManyToMany
 @NotFound(action = NotFoundAction.IGNORE)
 @JoinTable(name="JOB_ACTIVITES", joinColumns=@JoinColumn(name="jobId"),
            inverseJoinColumns=@JoinColumn(name="an"))
 private Collection<Activity> activities;

Activity实体

@OneToOne(fetch = FetchType.LAZY)
@JoinColumns(value = { @JoinColumn(name = "dwgNo", referencedColumnName = "dwgNo"), @JoinColumn(name = "rev", referencedColumnName = "rev") })
private Drawing drawing;

查询

public List<Activity> getActivitiesByJobId(Long jobId) {
    String criteria = "SELECT jb.activities FROM Job jb WHERE jb.jobId=:jobId";
    List<Activity> activities = em.createQuery(criteria).setParameter("jobId", Long.valueOf(jobId)).getResultList();
    return activities;
}

错误

javax.el.ELException: /job.xhtml value="#{activity.drawing.dwgNo}": org.hibernate.LazyInitializationException: 无法初始化代理 - 无会话

我理解错误,但我不知道如何修改我的查询以加入 Drawing 实体。

类似于

SELECT jb.activities FROM Job jb LEFT JOIN FETCH Drawing ON
ACTIVITY.dwgNo=Drawing.drwNo WHERE jb.jobId=:jobId";

但该语法更像是本地语法 SQL。你如何指定集合的​​路径?

由于关联的映射,Hibernate 已经知道它们是如何映射和链接在一起的。所以它不需要任何 ON 子句。 您可以为每个加入的协会分配一个别名,以便进一步加入或表达条件:

select activity from Job job 
inner join job.activities activity
left join fetch activity.drawing
where job.jobId = :jobId