Reputation: 3742
Job Entity
@ManyToMany
@NotFound(action = NotFoundAction.IGNORE)
@JoinTable(name="JOB_ACTIVITES", joinColumns=@JoinColumn(name="jobId"),
inverseJoinColumns=@JoinColumn(name="an"))
private Collection<Activity> activities;
Activity Entity
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns(value = { @JoinColumn(name = "dwgNo", referencedColumnName = "dwgNo"), @JoinColumn(name = "rev", referencedColumnName = "rev") })
private Drawing drawing;
Query
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;
}
Error
javax.el.ELException: /job.xhtml value="#{activity.drawing.dwgNo}": org.hibernate.LazyInitializationException: could not initialize proxy - no Session
I understand the error, But I don't know how to modify my query to join the Drawing
entity.
Something like
SELECT jb.activities FROM Job jb LEFT JOIN FETCH Drawing ON
ACTIVITY.dwgNo=Drawing.drwNo WHERE jb.jobId=:jobId";
but that syntax is more like native SQL. How do you specify the path on a collection?
Upvotes: 0
Views: 35
Reputation: 691735
Hibernate already knowws, thanks to the mapping of the associations, how they are mapped and linked together. So it doesn't need any ON
clause.
You can assign an alias to every joined association in order to further join or express criterias:
select activity from Job job
inner join job.activities activity
left join fetch activity.drawing
where job.jobId = :jobId
Upvotes: 1