hibernate的排序

来源:互联网 发布:linux 中7z解压怎么样 编辑:程序博客网 时间:2024/06/06 17:08

在查询对象的Set或Map成员时,您可以对其进行排序,排序可以在两个层次进行,一个是在Java执行环境中进行,一个是利用数据库本身的排序功能。


Java执行环境中进行排序:
---------------------------------


如果要在Java执行环境中进行排序,可以映像文件中设定sort属性,例如若为Set,则如下设定:
<set name="addrs" table="ADDRS" sort="natural">
<key column="USER_ID"/>
<element type="string" column="ADDRESS" not-null="true"/>
</set>
藉由指定sort为natural,Hibernate在加载数据库的数据时,将使用java.util.SortedSet型态对象,如果是String,则根据compareTo()方法来进行排序,上面的设定将会根据FILENAME进行排序。
如果是Map的话,则如下设定:
<map name="files" table="FILES" sort="natural">
<key column="USER_ID"/>
<index column="DESCRIPTION" type="string"/>
<element type="string" column="FILENAME" not-null="true"/>
</map>
上面的设定将使用java.util.SortedTree,根据DESCRIPTION进行排序,sort除了设定natural之外,也可以指定一个实现java.util.Comparator的类别名称。
eg:
public class UpPurviewComparator implements Comparator{
    public UpPurviewComparator() {   }

    public int compare(Object o1, Object o2){
        if(o1 == null){
            return o2 == null ? 0 : 1;
        }
        if(o2 == null){
            return -1;
        }
       
        if(o1 instanceof UpPurview && o2 instanceof UpPurview){
            UpPurview p1= (UpPurview)o1;
            UpPurview p2= (UpPurview)o2;
            String name1=p1.getModelname();
            String name2=p2.getModelname();
            if(p1.getId().compareTo(p2.getId())==0) return 0;
            if(name1.compareTo(name2)>0) return -1;
            if(name1.compareTo(name2)<0) return 1;
           
            else return -1;
        }
       
        return -1;
    }
}

<set name="upPurviews" cascade="none" table="UP_ROLE_PV_R" sort="com.ztenc.oa.mfp.dao.user.UpPurviewComparator">
            <key>
                <column name="role_id" not-null="true" />
            </key>
            <many-to-many column="purview_id" class="com.ztenc.oa.mfp.bean.UpPurview" />
        </set>

private Set upPurviews = new TreeSet(new UpPurviewComparator());

 

 

利用数据库本身的排序功能:
-----------------------------------


如果是利用数据库本身的排序功能,则使用order-by设定排序的方式,Hibernate会使用SQL语句在数据库中进行排序,例如在Set中是这么设定的:
<set name="addrs" table="ADDRS" order-by="ADDRESS desc">
<key column="USER_ID"/>
<element type="string" column="ADDRESS" not-null="true"/>
</set>
在类中:
private Set properties= new TreeSet();
在Map中也是相同的设定方式,您也可以利用数据库中的函式功能,例如:
<map name="files" table="FILES" order-by="lower(FILENAME)">
<key column="USER_ID"/>
<index column="DESCRIPTION" type="string"/>
<element type="string" column="FILENAME" not-null="true"/>
</map>
使用这个方法进行排序时,Hibernate会使用LinkedHashSet或LinkedHashMap实现查询时的排序,所以这个方法仅适用于JDK 1.4或以上的版本。

0 0
原创粉丝点击