Java Hibernate条件查询-无法识别一对多字段属性

Java Hibernate条件查询-无法识别一对多字段属性,java,database,hibernate,hql,criteria,Java,Database,Hibernate,Hql,Criteria,我正在尝试运行一个Hibernate条件查询,在对象不仅仅是一个原语的情况下进行比较,但是我遇到了一些问题 有关的条件查询: criteriaInList = session.createSQLQuery("select id from student where user_id = " + userID + " and school_id = " + schoolID + " and year = " + year).list(); criter

我正在尝试运行一个Hibernate条件查询,在对象不仅仅是一个原语的情况下进行比较,但是我遇到了一些问题

有关的条件查询:

            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)
提前感谢您的帮助。

您需要加入:

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

我懂了。很好,谢谢你!你知道为什么我不需要加入来做限制吗;标准?第一级的标识符列不需要别名或子标准,因为不需要联接。在SQL中,您也不会定义联接。
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 ...
}
criteria.createAlias("si.student", "student");
criteria.add(Restrictions.eq("student.year", year));