-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: One-to-many and many-to-many to find grandparents of child
PostPosted: Wed Feb 15, 2006 9:31 pm 
Regular
Regular

Joined: Wed Feb 15, 2006 9:09 pm
Posts: 76
Hello all,

I'm getting duplicate grandparents when querying the top of a one-to-many, then many-to-many relationship.

Hibernate version: 3.1.2

Code between sessionFactory.openSession() and session.close():
return session.createQuery( "select v from Vendor v "
+ "inner join v._projects as p "
+ "inner join p._users as u "
+ "where u._id = ?" ).setLong( 0, _user.getId() ).list();

Name and version of the database you are using: MySQL (community) 5.0.12

The generated SQL (show_sql=true):
select vendor0_.vendor_id as vendor1_12_, vendor0_.vendor_name as vendor2_12_ from vendor vendor0_ inner join project _projects1_ on vendor0_.vendor_id=_projects1_.vendor_id inner join user_project _users2_ on _projects1_.project_id=_users2_.project_id inner join user user3_ on _users2_.user_id=user3_.user_id where user3_.user_id=?
(or)
SELECT v.vendor_id, v.vendor_name FROM vendor v
INNER JOIN project p ON v.vendor_id = p.vendor_id
INNER JOIN user_project up ON p.project_id = up.project_id
INNER JOIN user u ON up.user_id = u.user_id
WHERE u.user_id = ?

Some other stuff I should probably include, excerpts for brevity
@Entity @Table(name="vendor") public class Vendor {
@Id @Column(name="vendor_id") private Long _id;
}

@Entity @Table(name="project") public class Project {
@Id @Column(name="project_id") private Long _id;
@Basic @Column(name="vendor_id",nullable=false) private Long _vendorId;
@ManyToOne @JoinColumn(name="vendor_id",nullable=false,insertable=false,updatable=false) private Vendor _vendor;
@ManyToMany(mappedBy="_projects",targetEntity=User.class) private Set<User> _users = new HashSet<User>();
}

@Entity @Table(name="user") public class User {
@Id @Column(name="user_id") private Long _id;
@ManyToMany(targetEntity=Project.class) @JoinTable(name="user_project",joinColumns={@JoinColumn(name="user_id")},inverseJoinColumns={@JoinColumn(name="project_id")}) private Set<Project> _projects = new HashSet<Project>();
}

More
So I have a table of vendors, and a table of projects, with a one-to-many between those. I have a table of users, with a many-to-many relationship between projects and users (user_project with 2 foreign keys and nothing else). I'm getting duplicate vendors returned in the list. Ordinarily, I'd just do:

SELECT v.vendor_id, v.vendor_name FROM vendor v
INNER JOIN project p ON v.vendor_id = p.project_id
INNER JOIN user_project up ON p.project_id = up.project_id
WHERE up.user_id = ?

which returns distinct records from the vendor table. Generally speaking, I want a list of vendors whose projects the current user is working on.

Now maybe it's just confusion more than anything, but I haven't actually mapped the user_project table to anything, I've only mapped the vendor, project and user tables. I'm wondering if I should:
1) Use a distinct clause to return distinct vendors? (ugh)
2) Make a new class UserProject and map it to the user_project table, then use that in the query instead?
3) Look what's behind door #3?

Thanks!


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.