2014-02-12 39 views
7

好傢伙我有這樣的代碼:Hibernate的預測與收藏ArrayIndexOutOfBoundsException異常

Criteria criteria = session.createCriteria(Department.class); 

ProjectionList properties = Projections.projectionList(); 
properties.add(Projections.property("id"), "id"); 
properties.add(Projections.property("name"), "name"); 
properties.add(Projections.property("children"), "children"); 

criteria.setProjection(properties); 
criteria.setFetchMode("children", FetchMode.JOIN); 
criteria.setResultTransformer(Transformers.aliasToBean(Department.class)); 

criteria.add(Restrictions.isNull("parent.id")); 
criteria.add(Restrictions.eq("active", true)); 

return criteria.list(); 

和實體類

public class Department extends Model { 

    @Size(max = 200) 
    private String name; 

    @Size(max = 10) 
    private String sg; 

    @Size(max = 1000) 
    private String description; 

    @ManyToOne 
    @JoinColumn(name = "id_parent") 
    private Department parent; 

    private boolean active; 

    @OneToMany(mappedBy = "parent") 
    private List<Department> children; 

...加上getter和setter ...

我執行標準並給我堆棧例外:

java.lang.ArrayIndexOutOfBoundsException: 2 
at org.hibernate.loader.criteria.CriteriaLoader.getResultRow(CriteriaLoader.java:166) 
at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:146) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:747) 
at org.hibernate.loader.Loader.processResultSet(Loader.java:949) 
at org.hibernate.loader.Loader.doQuery(Loader.java:917) 
at 

我在做什麼錯?

在此先感謝。

+1

將代碼發佈到「執行條件」和堆棧跟蹤。 – chrylis

回答

0

不知道你想用Projection查詢做什麼,很難說如何解決它。我認爲你的主要問題是你需要爲孩子創建一個別名,然後在你的投影中使用這個別名。在你的投影中,你還需要引用兒童的屬性。你可以這樣做:

Criteria criteria = session.createCriteria(Department.class); 

ProjectionList properties = Projections.projectionList(); 
properties.add(Projections.property("id"), "id"); 
properties.add(Projections.property("name"), "name"); 
properties.add(Projections.property("children.id"), "id"); 
properties.add(Projections.property("children.name"), "name"); 

criteria.setProjection(properties); 
criteria.createAlias("children", "children", JoinType.FULL_JOIN); 
criteria.setResultTransformer(Transformers.aliasToBean(Department.class)); 

criteria.add(Restrictions.isNull("parent.id")); 
criteria.add(Restrictions.eq("active", true)); 
return criteria.list(); 

這麼說,我覺得使用投影這裏是一個錯誤,不必要的,如果你的意圖是返回根部門的清單與他們的孩子系樹。爲此,您可以這樣做:

Criteria criteria = session.createCriteria(Department.class); 
criteria.createAlias("children", "children", JoinType.FULL_JOIN); 
criteria.add(Restrictions.isNull("parent.id")); 
criteria.add(Restrictions.eq("active", true)); 

retun criteria.list(); 
+0

謝謝,我使用的預測,因爲我只需要某些領域,謝謝你的答覆!我去試試你的解決方案! – EderRoger

+0

你想節省帶寬嗎?即使你不需要所有的字段,只需使用Hibernate投影來查詢實體就會更好。 aliasToBean轉換器不映射子關係。在github上有一個自定義轉換器,但它不適用於一對多,只有一對一和多對一的情況:https://github.com/samiandoni/AliasToBeanNestedResultTransformer – neildo

相關問題