jeff
jeff

Reputation: 3742

Hibernate Query Collection which also has a mapped entity

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

Answers (1)

JB Nizet
JB Nizet

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

Related Questions