2013-07-03 47 views
0

如何對外鍵記錄進行排序如何從對象中包含的一對多關係中排序實體

如何對包含在實體中的外鍵記錄進行排序?

我有一對多的關係:一個組可以包含很多站點。

Group.java

public class Group implements java.io.Serializable { 

    private static final long serialVersionUID = -3698414318830180024L; 

    private Collection<AppSite> appSites = new HashSet<AppSite>(); 

GroupDAO.java:

public class GroupDAO extends HibernateDaoSupport { 

    @SuppressWarnings("unchecked") 
    public Group getGroupById(Long id){ 
     Group group = getHibernateTemplate().get(Group.class, id); 
     return group; 
} 

這裏是一個循環這些記錄在jsp:

<p>Number of items: ${fn:length(groupCommand.group.appSites)}</p> 

<ul> 
    <c:forEach items="${groupCommand.group.appSites}" var="appSite"> 
     <li><a href="../appsites/appsite.page?appSiteId=${appSite.appSiteId}">${appSite.nameEng}</a></li> 
    </c:forEach> 
</ul> 

的問題是,appSite.nameEng ISN」排序正確。如何做到這一點?

到目前爲止,我有這個HQL:

from Group as g inner join g.appSites as s where g.appSiteGroupId=10 order by s.nameEng asc

在Eclipse/Hibernate的HQL編輯器,它返回的記錄適量。然而,當我改變我的DAO的方法是:

@SuppressWarnings("unchecked") 
public Group getGroupById(Long id){ 
    //Group group = getHibernateTemplate().get(Group.class, id); 
    Group group = (Group) getHibernateTemplate().find("from Group as g inner join g.appSites as s where g.appSiteGroupId=10 order by s.nameEng asc").get(0); 
    return group; 
} 

我得到這個錯誤:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to org.domain.Group

更新#1

我有這樣的:

@SuppressWarnings("unchecked") 
public Group getGroupById(Long id){ 
    //Group group = getHibernateTemplate().get(Group.class, id); 
    List<Group> groupList= getHibernateTemplate().find("from Group as g inner join g.appSites as s where g.appSiteGroupId=10 order by s.nameEng asc"); 
    return (groupList.size() > 0) ? groupList.get(0) : null; //line 17 
} 

產生的錯誤:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to org.domain.Group 
    org.dao.GroupDAO.getGroupById(GroupDAO.java:17) 

更新#2

另一種嘗試,同樣的問題

Group.java

public class Group implements java.io.Serializable { 

    private Collection<AppSite> appSites = new ArrayList<AppSite>(); 

AppSiteComparator.java

public class AppSiteComparator implements Comparator<AppSite> { 

    private String sortBy; 

    public AppSiteComparator(String sortBy){ 
     this.sortBy = sortBy; 
    } 

    public AppSiteComparator(){ 
     this.sortBy = "nameEng"; 
    } 

    @Override 
    public int compare(AppSite a1, AppSite a2){ 
     if(this.sortBy.equals("nameEng")) 
      return a1.getNameEng().compareTo(a2.getNameEng()); 
     else 
      return 0; 
    } 
} 

GroupDAO.java

@SuppressWarnings("unchecked") 
public Group getGroupById(Long id){ 
    Group group = getHibernateTemplate().get(Group.class, id); 
    Collections.sort((List<AppSite>) group.getAppSites(), new AppSiteComparator()); 
    return group; 
} 

錯誤

java.lang.ClassCastException: org.hibernate.collection.PersistentSet cannot be cast to java.util.List at org.dao.GroupDAO.getGroupById(GroupDAO.java:19)

更新#3

使用標準的嘗試:

Group group = (Group) session.createCriteria(Group.class)     
    .createAlias("appSites", "a") 
    .add(Restrictions.eq("appSiteGroupId",10L)) 
    .addOrder(Order.asc("a.nameEng")).list().get(0); 

仍然沒有工作...爲了顯示在控制檯:

Site name: test 4 
Site name: Test eng 
Site name: test 2 
Site name: test 3 

只注意到... SQL似乎是正確的:

Hibernate: select from serverlist.configtool_group this_ inner join serverlist.configtool_app_site a1_ on this_.app_site_group_id=a1_.app_site_group_id where this_.app_site_group_id=? order by a1_.name_eng asc

我錯了......在appSites財產另一個SQL設置,並沒有關係「T有任何形式:

Hibernate: select ... from serverlist.configtool_app_site appsites0_ where appsites0_.app_site_group_id=?

回答

0

appSite.nameEng不正確排序

您的appSite的類型是HashSet。所以本質上它沒有秩序。

導致ClassCastException異常的:

在您的查詢:

from Group as g inner join g.appSites as s where g.appSiteGroupId=10 order by s.nameEng asc 

您加入(內)兩個實體(GroupAppSite),所以查詢的結果是肯定不會的Group實體類型。您應該使用Query類的list()方法來處理這類查詢。

+0

查看更新#1,我收到了投射錯誤。 – TekiusFanatikus

+0

你知道一個替代方案來完成分類嗎?通過使用Criterias?另外,我完成了結果類名的輸出,得到了java.lang.Object。這應該表明我的問題。 – TekiusFanatikus

+0

是的,Criterias對你來說是很好的選擇,你應該使用'List'而不是'Set'.find'方法總是返回'Object',並且是通過拋出'Exception'來表示你的問題。 –

相關問題