Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Join Table with additional columns: One SQL Select to fetch data?

Hi,

yes I am using @JoinFetch.
Here are some Code

@Entity
class Customer {
    
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "customers")
    @JoinFetch(JoinFetchType.OUTER)
    private List<MapCustomerCourse> mapCourses;
}

@Entity
class Course {
   @Id
   private Integer id;
}

@Entity
class MapCustomerCourse {

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "customerId")
   @JoinFetch(JoinFetchType.OUTER)
   private Customer customer;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "courseId")
   @JoinFetch(JoinFetchType.OUTER)
   private Course course;
}


SQL Select:
Query q = entityManager.createQuery("SELECT c FROM Customer c WHERE (c.id =
1) OR (c.id = 2)");
q.setHint(QueryHints.READ_ONLY, HintValues.TRUE);
q.getResultList();

Resulting SQL:
SELECT t1...., t0...
FROM Customer t1 LEFT OUTER JOIN Map_Customer_Course t0 ON (t0.customerId =
t1.ID) 
WHERE ((t1.ID = ?) OR (t1.ID = ?))

I missing here the Join with the Course-Table and the resulting Course.*
data.
EclipseLink fires now for every resulting Course-ID a SQL query.


I get a better solution with the following query:
SQL Select:
Query q = entityManager.createQuery("SELECT m FROM MapCustomerCourse m WHERE
(m.customerId = 1) OR (m.customerId = 2)");
q.setHint(QueryHints.READ_ONLY, HintValues.TRUE);
q.getResultList();

Resulting SQL:
SELECT t1..., t0..., t2... 
FROM Map_Customer_Course t1 LEFT OUTER JOIN Customer t0 ON (t0.ID =
t1.customerId) LEFT OUTER JOIN Course t2 ON (t2.ID = t1.courseId) WHERE
((t1.customerId = ?) OR (t1.customerId = ?))

Ok, here I get the Join with Course-Table and the data.
Unfortunately, I get a list of Map-Java-Objects...I have to iterate through
this list to get the resulting Customers etc...unaesthetic.

I would do the select from the Customer-table and fetch all the necessary
data with one SQL Select.

Maybe I set the JoinFetch Annotations wrong?

Thanks in advance!

M.Joe




James Sutherland wrote:
> 
> You can use join fetching or batch reading for this, either at the query
> level, or the mapping level.
> 
> For mapping level, you can use the EclipseLink @JoinFetch annotation or
> xml to always join the relationship from Courses to Course.  You could
> also use a DescriptorCustomizer to set enable batch reading on the
> OneToOneMapping for course.
> 
> 
> 
> Joe Mc. wrote:
>> 
>> Hi,
>> 
>> I am playing with additional columns in join tables.
>> The following example:
>> Customer visits some Courses
>> This n-m-Relation contains additional attributes in the n-m-table (join
>> table), for example: note, year etc.
>> 
>> One solution is to use @OneToMany and @ManyToOne with a concret join
>> table in Java, insteed of @ManyToMany.
>> In this Association class, is it possible to hold the additional columns
>> This solution is fine and worked.
>> 
>> In @ManyToMany is it possible to tell EclipseLink, that he use only ONE
>> Select statement, to get all the data from the different tables (with
>> outer joins etc.).
>> Is it possible to do this now with the OneToMany and ManyToOne?
>> 
>> At the moment I get a join of Customer and Courses. And EclipseLink fires
>> for every Course, the customer holds, an additional SQL SELECT statement
>> to get the data :-(
>> 
>> I general: I want the same SQL SELECT statement as in the ManyToMany
>> case. Is it possible?
>> 
>> 
>> Thanks for any advice!
>> 
>> Regards
>> 
>> M.Joe
>> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Join-Table-with-additional-columns%3A-One-SQL-Select-to-fetch-data--tp24304704p24321401.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top