0

外部キーレコードをソートする方法

エンティティに含まれる外部キー レコードを並べ替えるにはどうすればよいですか?

1 対多の関係があります。1 つのグループに多くのサイトを含めることができます。

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 が正しくソートされていないことです。どうやってこれを行うのですか?

これまでのところ、私はこのHQLを持っています:

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

Eclipse/Hibernate HQL Editor では、適切な量のレコードが返されます。ただし、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 で設定されており、並べ替えがありません。

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

4

1 に答える 1

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

Group2 つのエンティティ (と) を(内部で) 結合しAppSiteているため、クエリの結果は確かにGroupエンティティ タイプではありません。この種のクエリを処理するには、クラスのlist()メソッドを使用する必要があります。Query

于 2013-07-03T18:12:36.680 に答える