在我的一对多和多对一的双向关系中,我想执行以下sql -
select * from user_credential c
join user_profile p on c.login_id = p.login_id
join user_address a on p.address_id = a.address_id
where p.profile_id = 1
但是,我得到了sql的结果 -
select * from user_credential c
join user_profile p on c.login_id = p.login_id
join user_address a on p.address_id = a.address_id
where p.credential_id = 1
hibernate实体详细信息 -
@Entity
@Table(name = "user_credential")
public class UserCredential implements Serializable {
private static final long serialVersionUID = -2839071606927921689L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "login_id", insertable = false, updatable = false, nullable = false)
private int login_id = 0;
@Column(name = "password", insertable = true, updatable = true, nullable = false)
private String password = null;
@OneToMany(mappedBy = "login_id", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<UserProfile> profiles = null;
//getters/setters
}
@Entity
@Table(name = "user_profile")
public class UserProfile implements Serializable {
private static final long serialVersionUID = 5765280899633539336L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "profile_id", length = 10, insertable = false, updatable = false, nullable = false)
private int profile_id = 0;
@ManyToOne
@JoinColumn(name = "login_id", insertable = true, updatable = true, nullable = false)
private UserCredential login_id = null;
@Column(name = "name", length = 20, insertable = true, updatable = true, nullable = false)
private String name = null;
@Column(name = "age", length = 3, insertable = true, updatable = true, nullable = false)
private byte age = 0;
@OneToMany(mappedBy = "profile_id", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<UserAddress> address = null;
//getters/setters
}
@Entity
@Table(name = "user_address")
public class UserAddress extends BaseTable{
private static final long serialVersionUID = 5036341911955664992L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "address_id", length = 10, insertable = false, updatable = false, nullable = false)
private int address_id = 0;
@ManyToOne
@JoinColumn(name = "profile_id", insertable = true, updatable = true, nullable = false)
private UserProfile profile_id = null;
@Column(name = "state", length = 20, insertable = true, updatable = true, nullable = false)
private String state = null;
@Column(name = "city", length = 20, insertable = true, updatable = true, nullable = false)
private String city = null;
//getters/setters
}
HQL:
select credential from UserCredential credential
join credential.profiles profile
where profile.profile_id = 1
我不明白,为什么hibernate会过滤父ID上的数据,以及我所需的sql将如何执行。我正在使用hibernate 4.3.8
如果有必要提供其他信息,请告诉我们。
答案 0 :(得分:1)
我会写这样的查询:
select distinct c
from Profile p
join p.login_id c
where p.profile_id = 1
删除重复项,从Child
加入Parent
可能会帮助您解决问题。