JPQL ManyToMany 查询问题(加入 Class)
JPQL ManyToMany Query issue (join Class)
我在 mysql 上有 table 由 ManyToMany 关联生成。
但是当我 运行 这个查询
select e from Employe e join e.listeRole c inner join c.Role r where r.IdRole = 1
我收到这个错误
13:11:51,959 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (http-localhost-127.0.0.1-8080-6) javax.ejb.EJBTransactionRolledbackException: org.hibernate.QueryException: could not resolve property: listEmploye of: metier.entities.Employe [select e from metier.entities.Employe e join e.listEmploye c inner join c.Role r where r.IdRole = 1]
13:11:51,960 ERROR [org.jboss.ejb3.invocation] (http-localhost-127.0.0.1-8080-6) JBAS014134: EJB Invocation failed on component Utilisateur for method public abstract java.util.List metier.sess.IUtilisateurLocal.RoleEmploye(): javax.ejb.EJBTransactionRolledbackException: org.hibernate.QueryException: could not resolve property: listEmploye of: metier.entities.Employe [select e from metier.entities.Employe e join e.listEmploye c inner join c.Role r where r.IdRole = 1]
我的类是
@Entity
public class Role {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer IdRole;
private String Intitule;
@ManyToMany(fetch=FetchType.EAGER,mappedBy="listeRole")
private List<Employe> listEmploye=new ArrayList<Employe>();
public Integer getIdRole() {
return IdRole;
}
public void setIdRole(Integer idRole) {
IdRole = idRole;
}
public String getIntitule() {
return Intitule;
}
public void setIntitule(String intitule) {
Intitule = intitule;
}
public List<Employe> getListEmploye() {
return listEmploye;
}
public void setListEmploye(List<Employe> listEmploye) {
this.listEmploye = listEmploye;
}
public Role(String intitule) {
super();
Intitule = intitule;
}
public Role() {
super();
// TODO Auto-generated constructor stub
}
}
和
@Entity
@DiscriminatorValue(value="employe")
public class Employe extends Utilisateur{
private String TypeEmploye;
private Integer authentification;
private Date logindate;
private Date logoutDate;
//Employe class
@ManyToMany(fetch=FetchType.EAGER)
private List<Role> listeRole=new ArrayList<Role>();
public String getTypeEmploye() {
return TypeEmploye;
}
public void setTypeEmploye(String typeEmploye) {
TypeEmploye = typeEmploye;
}
public Integer getAuthentification() {
return authentification;
}
public Date getLogindate() {
return logindate;
}
public void setLogindate(Date logindate) {
this.logindate = logindate;
}
public Date getLogoutDate() {
return logoutDate;
}
public void setLogoutDate(Date logoutDate) {
this.logoutDate = logoutDate;
}
public void setAuthentification(Integer authentification) {
this.authentification = authentification;
}
public List<Role> getListeRole() {
return listeRole;
}
public void setListeRole(List<Role> listeRole) {
this.listeRole = listeRole;
}
public Employe(String username, String password, String email,
boolean statut, String typeEmploye, Integer authentification,
List<Role> listeRole) {
super(username, password, email, statut);
TypeEmploye = typeEmploye;
this.authentification = authentification;
this.listeRole = listeRole;
}
public Employe() {
super();
// TODO Auto-generated constructor stub
}}
谢谢你的帮助
对于多对多,您应该按如下方式在拥有方定义可连接对象:
@ManyToMany
@JoinTable(name = "emp_roles", joinColumns = {@JoinColumn(name = "emp_id",
referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "role_id",
referencedColumnName = "id")})
private List<Role> listeRole;
在您的案例中,这就是该映射应该位于的员工实体。
为什么你有从 Role 到 employee 的引用?我不明白你为什么要使用它,所以我建议你将双向映射更改为单向映射(所以只需将员工列表放在角色实体中)
我在 mysql 上有 table 由 ManyToMany 关联生成。 但是当我 运行 这个查询
select e from Employe e join e.listeRole c inner join c.Role r where r.IdRole = 1
我收到这个错误
13:11:51,959 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (http-localhost-127.0.0.1-8080-6) javax.ejb.EJBTransactionRolledbackException: org.hibernate.QueryException: could not resolve property: listEmploye of: metier.entities.Employe [select e from metier.entities.Employe e join e.listEmploye c inner join c.Role r where r.IdRole = 1] 13:11:51,960 ERROR [org.jboss.ejb3.invocation] (http-localhost-127.0.0.1-8080-6) JBAS014134: EJB Invocation failed on component Utilisateur for method public abstract java.util.List metier.sess.IUtilisateurLocal.RoleEmploye(): javax.ejb.EJBTransactionRolledbackException: org.hibernate.QueryException: could not resolve property: listEmploye of: metier.entities.Employe [select e from metier.entities.Employe e join e.listEmploye c inner join c.Role r where r.IdRole = 1]
我的类是
@Entity
public class Role {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer IdRole;
private String Intitule;
@ManyToMany(fetch=FetchType.EAGER,mappedBy="listeRole")
private List<Employe> listEmploye=new ArrayList<Employe>();
public Integer getIdRole() {
return IdRole;
}
public void setIdRole(Integer idRole) {
IdRole = idRole;
}
public String getIntitule() {
return Intitule;
}
public void setIntitule(String intitule) {
Intitule = intitule;
}
public List<Employe> getListEmploye() {
return listEmploye;
}
public void setListEmploye(List<Employe> listEmploye) {
this.listEmploye = listEmploye;
}
public Role(String intitule) {
super();
Intitule = intitule;
}
public Role() {
super();
// TODO Auto-generated constructor stub
}
}
和
@Entity
@DiscriminatorValue(value="employe")
public class Employe extends Utilisateur{
private String TypeEmploye;
private Integer authentification;
private Date logindate;
private Date logoutDate;
//Employe class
@ManyToMany(fetch=FetchType.EAGER)
private List<Role> listeRole=new ArrayList<Role>();
public String getTypeEmploye() {
return TypeEmploye;
}
public void setTypeEmploye(String typeEmploye) {
TypeEmploye = typeEmploye;
}
public Integer getAuthentification() {
return authentification;
}
public Date getLogindate() {
return logindate;
}
public void setLogindate(Date logindate) {
this.logindate = logindate;
}
public Date getLogoutDate() {
return logoutDate;
}
public void setLogoutDate(Date logoutDate) {
this.logoutDate = logoutDate;
}
public void setAuthentification(Integer authentification) {
this.authentification = authentification;
}
public List<Role> getListeRole() {
return listeRole;
}
public void setListeRole(List<Role> listeRole) {
this.listeRole = listeRole;
}
public Employe(String username, String password, String email,
boolean statut, String typeEmploye, Integer authentification,
List<Role> listeRole) {
super(username, password, email, statut);
TypeEmploye = typeEmploye;
this.authentification = authentification;
this.listeRole = listeRole;
}
public Employe() {
super();
// TODO Auto-generated constructor stub
}}
谢谢你的帮助
对于多对多,您应该按如下方式在拥有方定义可连接对象:
@ManyToMany
@JoinTable(name = "emp_roles", joinColumns = {@JoinColumn(name = "emp_id",
referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "role_id",
referencedColumnName = "id")})
private List<Role> listeRole;
在您的案例中,这就是该映射应该位于的员工实体。
为什么你有从 Role 到 employee 的引用?我不明白你为什么要使用它,所以我建议你将双向映射更改为单向映射(所以只需将员工列表放在角色实体中)