1 Reply Latest reply on Nov 20, 2006 7:06 AM by herkules

    Fetch join with collection

    herkules

      Hi,

      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

        • 1. Re: Fetch join with collection
          herkules

          The fix is quite easy, use "SELECT DISTINCT ta FROM ...".
          The Enterprice JavaBeans 3.0, chapter 9, Queries and EJB QL doesn't mention DISTINCT in the Fetch Joins sample. Is this bug in the book?

          Jan