2013-07-03 50 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'来表示你的问题。 –

相关问题