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
工作实体
@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