Hibernate QueryException:无法解析 属性
Hibernate QueryException: could not resolve property
所以我在这 3 个表之间有这些关系
我想做的是搜索(通过 code
或 designation
)并获取特定负责人的项目列表,如下所示:
SELECT * FROM Project p JOIN ProjectHasChief phc ON (p.id = phc.idproject)
JOIN Chief c ON (c.id = phc.id_chief)
WHERE c.id = (myID)
AND (designation LIKE '%user_string%' OR code LIKE '%user_string%');
并且由于我使用的是休眠模式,所以我使用了 Criteria
:
Criteria c = session.createCriteria(ProjectHasChief.class);
c.add(Restrictions.eq("chief", chief))
.add(Restrictions.disjunction()
.add(Restrictions.like("project.designation", reg, MatchMode.ANYWHERE))
.add(Restrictions.like("project.code", reg, MatchMode.ANYWHERE)));
List<ProjectHasChief> list = (List<ProjectHasChief>)c.list();
但是我得到这个错误:
org.hibernate.QueryException: could not resolve property: project.designation of: smt.agm.entities.ProjectHasChief
项目实体:
@Entity
@Table(name="projet")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@Column(name="code")
private String code;
@Column(name="designation")
private String designation;
@OneToMany(cascade = CascadeType.ALL, mappedBy="project", orphanRemoval=true)
@OrderBy(clause="id DESC")
private List<ProjectHasChief> chiefs = new ArrayList<ProjectHasChief>();
}
首席实体:
@Entity
@Table(name="chief")
public class Chief {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@Column(name = "name")
private String name;
}
ProjectHasChief 实体:
@Entity
@Table(name="mapping_chantier_chef")
public class ProjectHasChief {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@ManyToOne
private Project project;
@ManyToOne
private Chief chief;
@Column(name="date_deb")
private Date startDate;
@Column(name="date_fin")
private Date endDate;
}
当休眠不知道 Project
实体的 属性 designation
时?!!
您绝对确定所有映射和连接都有效吗?
如果是这样,您可以尝试为 Project 声明一个隐式别名,如下所示:
Criteria c = session.createCriteria(ProjectHasChief.class);
c.createAlias("project", "project") //THIS ONE
c.add(Restrictions.eq("chief", chief))
c.add(Restrictions.disjunction()
.add(Restrictions.like("project.designation", reg, MatchMode.ANYWHERE))
.add(Restrictions.like("project.code", reg, MatchMode.ANYWHERE)));
List<ProjectHasChief> list = (List<ProjectHasChief>)c.list();
所以我在这 3 个表之间有这些关系
我想做的是搜索(通过 code
或 designation
)并获取特定负责人的项目列表,如下所示:
SELECT * FROM Project p JOIN ProjectHasChief phc ON (p.id = phc.idproject)
JOIN Chief c ON (c.id = phc.id_chief)
WHERE c.id = (myID)
AND (designation LIKE '%user_string%' OR code LIKE '%user_string%');
并且由于我使用的是休眠模式,所以我使用了 Criteria
:
Criteria c = session.createCriteria(ProjectHasChief.class);
c.add(Restrictions.eq("chief", chief))
.add(Restrictions.disjunction()
.add(Restrictions.like("project.designation", reg, MatchMode.ANYWHERE))
.add(Restrictions.like("project.code", reg, MatchMode.ANYWHERE)));
List<ProjectHasChief> list = (List<ProjectHasChief>)c.list();
但是我得到这个错误:
org.hibernate.QueryException: could not resolve property: project.designation of: smt.agm.entities.ProjectHasChief
项目实体:
@Entity
@Table(name="projet")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@Column(name="code")
private String code;
@Column(name="designation")
private String designation;
@OneToMany(cascade = CascadeType.ALL, mappedBy="project", orphanRemoval=true)
@OrderBy(clause="id DESC")
private List<ProjectHasChief> chiefs = new ArrayList<ProjectHasChief>();
}
首席实体:
@Entity
@Table(name="chief")
public class Chief {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@Column(name = "name")
private String name;
}
ProjectHasChief 实体:
@Entity
@Table(name="mapping_chantier_chef")
public class ProjectHasChief {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition="serial")
private int id;
@ManyToOne
private Project project;
@ManyToOne
private Chief chief;
@Column(name="date_deb")
private Date startDate;
@Column(name="date_fin")
private Date endDate;
}
当休眠不知道 Project
实体的 属性 designation
时?!!
您绝对确定所有映射和连接都有效吗?
如果是这样,您可以尝试为 Project 声明一个隐式别名,如下所示:
Criteria c = session.createCriteria(ProjectHasChief.class);
c.createAlias("project", "project") //THIS ONE
c.add(Restrictions.eq("chief", chief))
c.add(Restrictions.disjunction()
.add(Restrictions.like("project.designation", reg, MatchMode.ANYWHERE))
.add(Restrictions.like("project.code", reg, MatchMode.ANYWHERE)));
List<ProjectHasChief> list = (List<ProjectHasChief>)c.list();