使用Hibernate条件获取两个对象的属性
使用Criteria API运行查询时获取异常使用Hibernate条件获取两个对象的属性,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,使用Criteria API运行查询时获取异常 org.hibernate.QueryException: could not resolve property: com of: com.data.Collage at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44) at org.hibernate.persi
org.hibernate.QueryException: could not resolve property: com of: com.data.Collage at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1362)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:204)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:191)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:81)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:58)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
我们已经完成了上述类的映射
现在我正试图在一个查询中获取collageID和StudentID中的collage name和student name。已为此使用标准API
Criteria cr = session.createCriteria("com.data.Collage","collageAlias");
cr.createAlias("com.data.Student","studentAlias");
cr.add(Restrictions.eq("collageAlias.id", "402882c2369bc53901369bc95d5f0137"));
cr.add(Restrictions.eq("studentAlias.id","ff80808134cbe5a10134d14ff20300a9"));
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("collageAlias.collageName"));
properties.add(Projections.property("studentAlias.studentName"));
cr.setProjection(properties);
List collage_student = cr.list();
我尝试了Collage.class,删除了Collage的别名,作为t的criteria API的默认类,但它不起作用
有什么建议吗?什么时候有
cr.createAlias("com.data.Student","studentAlias");
Hibernate自动认为Student是拼贴
类的一个字段,因为标准是建立在该类的基础上的。通过创建别名,可以自动对该特定实体进行连接
由于您的拼贴
类没有名为“com.data.Student”的属性,因此会导致错误
<>你应该考虑一下重构你的代码。如果希望拼贴
处理学生
实体列表,请将列表学生
更改为列表学生
。现在,您可以映射这些类,以便告诉Hibernate这两个实体之间的关系:
@Entity
class Collage {
int id;
String collageName;
List<Student> lstStudent;
}
@Entity
class Student{
String studentName;
Collage collage;
int id;
}
,而在Student
课程中,你将有:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "collage")
public List<Student> getStudents() {
return this.lstStudents;
}
@ManyToOne(fetch = FetchType.LAZY)
public Collage getCollage(){
return this.collage;
}
这基本上允许您在拼贴
类上创建标准,并使用别名直接访问学生列表
:
cr.createAlias("lstStudent", "studentsAlias");
只是想一想,因为您的字段是包私有的,所以其他代码可能无法访问它们(如果它不在同一个包中)。尝试将它们公开,或者为它们添加getter和setter。
cr.createAlias("lstStudent", "studentsAlias");