2014-02-25 29 views
0

我試圖運行一個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 ... 
} 

Student類:

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 ... 
} 

在此先感謝您的幫助。

回答

0

你需要一個連接:

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

我明白了。這很好,謝謝!你知道爲什麼我不需要連接來執行Restrictions.in(「si.student.id」,列表)。標準? – rawkfist0215

+0

因爲不需要連接,所以第一級的標識符列不需要別名或子標準。在SQL中,你也不會定義一個連接。 – djmj