hibernate 查询中实现order by的 NULLS LAST 和 NULLS FIRST

1:创建一个CustomNullsFirstInterceptor类

public class CustomNullsFirstInterceptor extends EmptyInterceptor {
    private static final long serialVersionUID = -3156853534261313031L;

    private static final String ORDER_BY_TOKEN = "order by";

    public String onPrepareStatement(String sql) {

        int orderByStart = sql.toLowerCase().indexOf(ORDER_BY_TOKEN);
        if (orderByStart == -1) {
            return super.onPrepareStatement(sql);
        }
        orderByStart += ORDER_BY_TOKEN.length() + 1;
        int orderByEnd = sql.indexOf(")", orderByStart);
        if (orderByEnd == -1) {
            orderByEnd = sql.indexOf(" UNION ", orderByStart);
            if (orderByEnd == -1) {
                orderByEnd = sql.length();
            }
        }
        String orderByContent = sql.substring(orderByStart, orderByEnd);
        String[] orderByNames = orderByContent.split("\\,");
        for (int i=0; i<orderByNames.length; i++) {
            if (orderByNames[i].trim().length() > 0) {
                if (orderByNames[i].trim().toLowerCase().endsWith("desc")) {
                    orderByNames[i] += " NULLS LAST";
                } else {
                    orderByNames[i] += " NULLS FIRST";
                }
            }
        }
        orderByContent = StringUtils.join(orderByNames, ",");
        sql = sql.substring(0, orderByStart) + orderByContent + sql.substring(orderByEnd);
        return super.onPrepareStatement(sql);
    }

}

2.xml

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan">
            <list>
                <value>com.skywin.law.workflow.domain</value>
                <!--<value>com.skywin.common.fileupload.domain</value>-->
                <value>com.skywin.common.domain</value>
                <value>com.skywin.chat.domain</value>
                <value>com.skywin.law.assistflow.domain</value>
            </list>
        </property>
        <property name="mappingResources" ref="sessionFactoryMappingResources"></property>
        <property name="hibernateProperties">
            <props>

                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <!-- <prop key="hibernate.cache.provider_configuration_file_resource_path">diss-override-ehcache.xml</prop> -->
                <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
                <!-- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> -->

                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.show_sql">true</prop>
             <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">0</prop>
                <prop key="hibernate.hbm2ddl.import_files">import-install.sql</prop>
            </props>
        </property>

        <property name="entityCacheStrategies">
                <props>
                    <prop key="org.jbpm.pvm.internal.task.TaskImpl">read-write</prop>
                </props>
        </property>

        <property name="entityInterceptor">

        <bean id ="customNullsFirstInterceptor" class="com.skywin.common.hibernate3.CustomNullsFirstInterceptor" />

        </property>

    </bean>
时间: 2024-08-03 22:53:49

hibernate 查询中实现order by的 NULLS LAST 和 NULLS FIRST的相关文章

Hibernate HQL中的子查询

子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List list=session.createQuery("from Customer c where 1<(select count(o) from c.orders o)").list(); 上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为: Select * from

记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

今天在工程中遇到Hibernate查询的时候,bean中的字段和数据库中的字段不符合(bean中有pageTime字段,但是数据库中没有此列)报错问题. 具体问题环境: 在auto_off表中,off_time字段是bigint类型,用于存放unix时间戳,bean中对应属性类型为Long类型,但是前台传递过来的时间是String类型(2016-11-25) 解决办法1: 在bean中添加一个String类型的pageTime字段,然后前台传递过来的数据使用pageTime接收,再将值转换成lo

Hibernate之查询中get()和load()的区别,list()和iterate()的区别

[Hibernate]之查询中get()和load()的区别,list()和iterate()的区别 list()查询 //一次性把数据对象取出来 @Test public void findTestList(){ Session s=sessionFactory.getCurrentSession(); s.beginTransaction(); List<Person> persons=s.createQuery("from Person").list(); for(P

Hibernate 查询结果与数据库中的数据不一致

hibernate的bug: https://hibernate.atlassian.net/browse/HHH-4956 解决办法: 添加别名select max(max_pre_nights) ,max(max_post_nights) from package_pre_post_hotel where package_id = :packageId添加别名后可以解决问题,如果SQL中的列名不是唯一的,最好都添加别名,比如 select a.id as a_id , b.id as b_i

hibernate 查询方式汇总

主要摘自  http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/article/details/7703429 Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式     这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来

Hibernate查询方式

Hibernate查询方式 1 对象导航查询 (1)根据id查询某个客户,再查询这个客户里面所有的联系人   2 OID查询 (1)根据id查询某一条记录,返回对象   3 HQL查询 (1)Query对象,写hql语句实现查询   4 QBC查询 (1)Criteria对象   5 本地sql查询 (1)SQLQuery对象,使用普通sql实现查询 对象导航查询 1 查询某个客户里面所有联系人过程,使用对象导航实现   2 代码 OID查询 1 根据id查询记录 (1)调用session里面的

Hibernate查询方式 一

Hibernate查询方式 说到hibernate的查询方式,我们自然而然就想到了它--hql,hibernate query language.hql是使用hibernate框架的变成配朋友们使用最多的一种方式,它以自身的独特的优势:屏蔽数据库,书写灵活的优点,备受大家的青睐.但是Hibernate不仅给我们提供了这一种查询方式,这时候悠然要说来,是不只一种,还有sql,对,确实还有sql,但是还有一种,就是Criteria 查询.那么今天,我们就来聊一聊hibernate的几种查询方式. H

Hibernate查询(一)

Hibernate查询 HQL vs EJBQL 1.NativeSQL>HQL>EJBQL(JPQL)>QBC(Query By Creteria)>QBE(Query By Example) 情景: 假设,Category表示的是论坛上的板块,Topic表示的是板块下面的主题,Msg表示的主题下的回复的帖子. 因而:Category和Topic之间是一对多.Topic和Msg是一对多 (1)save()方法如下: public void testSave() { Session

hibernate查询方式和查询策略

1.Hibernate框架的查询方式    1) 唯一标识OID的检索方式        * session.get(对象.class,OID)    2) 对象的导航的方式        3) HQL的检索方式        * Hibernate Query Language    -- Hibernate的查询语言        4) QBC的检索方式        * Query By Criteria    -- 条件查询        5) SQL检索方式(了解)        *