2012-09-10 43 views
0

獲取異常,而使用標準API使用標準的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) 

有類定義運行HQL查詢的性能如下

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,爲拼貼刪除別名,作爲t的標準API的默認類,但它沒有奏效。

有什麼建議嗎?

+0

只是一個想法,因爲你的領域是包私有,他們可能無法訪問到您的其他代碼(如果它不是在相同的包裝)。嘗試將它們公開或添加,併爲它們添加getter和setter。 –

回答

2

當你

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

,Hibernate自動認爲學生是Collage類的字段,因爲標準是建立在階級。通過創建別名,您可以自動在該特定實體上進行連接。

由於您的Collage類沒有名爲「com.data.Student」的屬性,因此會導致您的錯誤。

你應該考慮重構一下你的代碼。如果您希望Collage處理Student實體列表,請將List lstStudent更改爲List<Student> lstStudent。現在,讓你告訴Hibernate 2個實體之間的關係,你可以映射類:

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

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

Collage類的List<Student> lstStudent吸氣,你將有:

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

,而在Student類的Collage吸氣,你將有:

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

這基本上可以讓你創建一個搜索標準一對Collage類,並有一個別名,其Students列表的直接訪問:

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

這適用於.....謝謝。 – user1041580