Fetch join with collection
herkules Jul 21, 2006 5:36 AMHi,
I can fetch join lazy relation that returns single result, but for collection it doesn't work correctly.
I have Attribute.java:
@Entity
public class Attribute implements Serializable {
private Long id;
private List<Resource> resources = new ArrayList<Resource>();
public Attribute() {
super();
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public List<Resource> getResources() {
return resources;
}
}
and Resource.java:
@Entity
public class Resource implements Serializable {
private Long id;
private int resourceSize = 0;
public Resource() {
super();
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public int getResourceSize() {
return resourceSize;
}
public void setResourceSize(int resourceSize) {
this.resourceSize = resourceSize;
}
}
and a finder:
public List<Attribute> findWithResource(int resourceSize) {
return em.createQuery(
"SELECT ta FROM Attribute ta INNER JOIN FETCH ta.resources r" +
" WHERE r.resourceSize = :resourceSize")
.setParameter("resourceSize", resourceSize)
.getResultList();
}
This should return all attributes that have resource of requested resourceSize with fetched resources.
Database content:
Attribute1: resource1 (resourceSize = 1), resource2 (resourceSize = 1), resource3 (resourceSize = 1)
Attribute2: resource1 (resourceSize = 1), resource2 (resourceSize = 1), resource3 (resourceSize = 1)
The query generated by EJB3 looks correctly:
select ... from Attribute attribute0_ inner join Attribute_Resource resources1_ on attribute0_.id=resources1_.Attribute_id inner join Resource resource2_ on resources1_.resources_id=resource2_.id where resource2_.resourceSize=?
When I call findWithResource(1), I expect to get two Attributes, each with the three resources loaded. Instead I get six Attributes, each with three resources loaded.
I this bug inside my query, unsupported feature or bug in EJB3?
Thank you for your care, Jan