问题描述
|
我有一个称为MenuPrevilege的关联表,位于称为Menu和Previlege的2个表之间。
为了获取特定特权的所有菜单,我在Menu实体中创建了一个命名查询:
@Entity
@NamedQueries( {
@NamedQuery(name = \"getAllMenus\",query = \"select m from Menu m\"),@NamedQuery(name = \"getMenusByPrevilegeId\",query = \"select m from Menu m
JOIN m.menuPrevilege mp where mp.previlege_id = :p\")})
public class Menu implements Serializable {
private String url;
private String description;
private List<MenuPrevilege> menuPrevilges;
private static final long serialVersionUID = 1L;
public Menu() {
super();
}
@Id
public String getUrl() {
return this.url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public void setMenuPrevilges(List<MenuPrevilege> menuPrevilges) {
if (menuPrevilges == null)
menuPrevilges = new ArrayList<MenuPrevilege>();
this.menuPrevilges = menuPrevilges;
}
@OnetoMany(mappedBy = \"menu\",cascade = CascadeType.REMOVE)
public List<MenuPrevilege> getMenuPrevilges() {
if (menuPrevilges == null)
menuPrevilges = new ArrayList<MenuPrevilege>();
return menuPrevilges;
}
public Menu(String url,String description) {
super();
this.url = url;
this.description = description;
}
}
我遇到此异常org.hibernate.QueryException:无法解析property:menuPrevilege,我也不知道如何处理它。这是MenuPrevilege实体:
@Entity
@Table(name = \"Menu_Previlege\")
public class MenuPrevilege implements Serializable {
private IdMenuPrevilege idmenuPrevilege = new IdMenuPrevilege();
private Date activationDate;
private Date deactivationDate;
private Menu menu;
private Previlege previlege;
private static final long serialVersionUID = 1L;
public MenuPrevilege() {
super();
}
@EmbeddedId
public IdMenuPrevilege getIdmenuPrevilege() {
return this.idmenuPrevilege;
}
public void setIdmenuPrevilege(IdMenuPrevilege idmenuPrevilege) {
this.idmenuPrevilege = idmenuPrevilege;
}
@Temporal(TemporalType.DATE)
public Date getActivationDate() {
return this.activationDate;
}
public void setActivationDate(Date activationDate) {
this.activationDate = activationDate;
}
@Temporal(TemporalType.DATE)
public Date getDeactivationDate() {
return this.deactivationDate;
}
public void setDeactivationDate(Date deactivationDate) {
this.deactivationDate = deactivationDate;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
@ManyToOne
@JoinColumn(name = \"menu_id\",insertable = false,updatable = false)
public Menu getMenu() {
return menu;
}
public void setPrevilege(Previlege previlege) {
this.previlege = previlege;
}
@ManyToOne
@JoinColumn(name = \"previlege_id\",updatable = false)
public Previlege getPrevilege() {
return previlege;
}
public MenuPrevilege(Menu menu,Previlege previlege) {
super();
getIdmenuPrevilege().setIdMenu(menu.getUrl());
getIdmenuPrevilege().setIdPrevilege(previlege.getPrevilegeId());
this.setMenu(menu);
this.setPrevilege(previlege);
menu.getMenuPrevilges().add(this);
previlege.getPrevilegeMenus().add(this);
}
}
解决方法
我对我的代码进行了名称重构,以编辑我的查询,一切似乎都正常了。更改如下:
在命名查询中:
@NamedQuery(name = \"getMenusByPrevilegeId\",query = \"select m from Menu m JOIN
m.previleges p where p.previlege.previlegeId = :p\")})
实体属性
private List<MenuPrevilege> previleges;
// getters and setters as well
在MenuPrevilege实体的构造函数中
public MenuPrevilege(Menu menu,Previlege previlege) {
super();
getIdmenuPrevilege().setIdMenu(menu.getUrl());
getIdmenuPrevilege().setIdPrevilege(previlege.getPrevilegeId());
this.setMenu(menu);
this.setPrevilege(previlege);
menu.getPrevileges().add(this);
previlege.getMenus().add(this);
}
如您所见,这是导致查询异常的语法错误。