【问题标题】:Using Hibernate criteria fetch properties of two objects使用 Hibernate 标准获取两个对象的属性
【发布时间】:2012-09-10 11:29:44
【问题描述】:

使用 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.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)

类定义如下

class Collage {
int id;
String collageName;
List lstStudent;
}

class Student{
String studentName;
int id;
}

已完成上述类的映射。

现在我正在尝试在我有 collageID 和 StudentID 的单个查询中获取拼贴名称和学生姓名。为此使用了 Criteria 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 的别名作为标准 API 的默认类,但它没有用。

有什么建议吗?

【问题讨论】:

  • 只是一个想法,因为您的字段是包私有的,您的其他代码可能无法访问它们(如果它不在同一个包中)。尝试将它们公开或为它们添加 getter 和 setter。

标签: hibernate hibernate-criteria


【解决方案1】:

当你这样做时

cr.createAlias("com.data.Student","studentAlias");

Hibernate 自动认为 Student 是 Collage 类的一个字段,因为标准是建立在该类之上的。通过创建别名,您可以自动在该特定实体上进行连接。

由于您的 Collage 类没有名为“com.data.Student”的属性,因此会导致您的错误。

您应该考虑稍微重构一下您的代码。如果您希望Collage 处理Student 实体列表,请将List lstStudent 更改为List&lt;Student&gt; lstStudent。现在,您可以映射类,以便告诉 Hibernate 2 个实体之间的关系:

@Entity
class Collage {
    int id;
    String collageName;
    List<Student> lstStudent;
}

@Entity
class Student{
    String studentName;
    Collage collage;
    int id;
}

List&lt;Student&gt; lstStudent getter 的Collage 类中,您将拥有:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "collage")
public List<Student> getStudents() {
    return this.lstStudents;
}

,而在 Student 的 getter Collage 类中,您将拥有:

@ManyToOne(fetch = FetchType.LAZY)
public Collage getCollage(){
    return this.collage;
}

这基本上允许您在 Collage 类上创建一个 Criteria 并使用别名直接访问其 Students 列表:

cr.createAlias("lstStudent", "studentsAlias");     

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多