如何對外鍵記錄進行排序如何從對象中包含的一對多關係中排序實體
如何對包含在實體中的外鍵記錄進行排序?
我有一對多的關係:一個組可以包含很多站點。
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=?
查看更新#1,我收到了投射錯誤。 – TekiusFanatikus
你知道一個替代方案來完成分類嗎?通過使用Criterias?另外,我完成了結果類名的輸出,得到了java.lang.Object。這應該表明我的問題。 – TekiusFanatikus
是的,Criterias對你來說是很好的選擇,你應該使用'List'而不是'Set'.find'方法總是返回'Object',並且是通過拋出'Exception'來表示你的問題。 –