【问题标题】:Hibernate Criteria query - Not recognizing One To Many field property休眠条件查询 - 无法识别一对多字段属性
【发布时间】:2014-02-25 16:35:17
【问题描述】:

我正在尝试运行 Hibernate Criteria 查询,该查询在对象不仅仅是一个原始对象的情况下进行比较,但我遇到了一些麻烦。

有问题的条件查询:

            criteriaInList = session.createSQLQuery("select id from student where user_id = " + userID + " and school_id = " + schoolID + " and year = " + year).list();
            criteria = session.createCriteria(StudentInteraction.class, "si");
            criteria.add(Restrictions.in("si.student.id", criteriaInList));
            criteria.add(Restrictions.eq("si.interaction_type.id", 6));
            criteria.add(Restrictions.eq("si.student_year", year));
            criteria.add(Restrictions.eq("si.student.year", year)); // To ensure that the interaction is current make sure the year on the interaction record and the student's grade match.
            ProjectionList projectionList = Projections.projectionList();
            projectionList.add(Projections.rowCount());
            criteria.setProjection(projectionList);

由于某种原因,这种语法很好:

criteria.add(Restrictions.in("si.student.id", criteriaInList));

但我一添加:

criteria.add(Restrictions.eq("si.student.year", year));

它引发了以下异常:

org.hibernate.QueryException: could not resolve property: student.year of: cas.models.StudentInteraction
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:96)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1457)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:483)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:498)
at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:68)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:102)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1697)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at cas.persistence.GenericDaoHibernateImpl.getStudentStats(GenericDaoHibernateImpl.java:2063)

StudentInteraction 类:

public class StudentInteraction implements Comparable<StudentInteraction> {

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private ListInteraction interaction_type;

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private Student student;

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private GroupInteraction group;

@Id
@GeneratedValue
private int id;


@Column(name="date")
private Date date;

@Column(name="topic")
private String topic;
@Column(name="notes", length=1000)
private String notes;
@Column(name="student_year")    // The year the student is/was in when the interaction was recorded
private int student_year;

    ... Getters and Setters ...
}

学生类:

public class Student {
@Id
@GeneratedValue
private Integer id;

@Column(name="first_name")
private String first_name;
@Column(name="last_name")
private String last_name;
@Column(name="middle_initial")
private String middle_initial;
@Column(name="dob")
private Timestamp dob;
@Column(name="year")
private Integer year;
@Column(name="notes")
private String notes;
@Column(name="gender", columnDefinition = "int default 0")
private Integer gender; // 1 for Male 2 for Female
@Column(name="tracking_number")
private String tracking_number;
... Getters and setters omitted ...
}

提前感谢您的帮助。

【问题讨论】:

    标签: java database hibernate hql criteria


    【解决方案1】:

    您需要加入:

    criteria.createAlias("si.student", "student");
    criteria.add(Restrictions.eq("student.year", year));
    

    【讨论】:

    • 我明白了。效果很好,谢谢!你知道为什么我不需要加入来做 Restrictions.in("si.student.id", list);标准?
    • 第一级标识符列不需要别名或子条件,因为不需要连接。在 SQL 中,您也不会定义连接。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多