关于 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:加入配置
<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>
分享到:
相关推荐
将字符串排序为 SQL 这是一个 rust crate,用于将“排序表达式”转换为可在“ORDER BY”中使用的 SQL 表达式。 例如, -date,id将转换为date DESC NULLS LAST, id ASC NULLS LAST 。 它可用于将 HTTP 查询参数转换...
适用情况: oracle 对查询结果进行排序时,被排序的栏位存在null值,且要指定NULL值排在最前面或者最后面 关键字:Nulls First;Nulls Last 默认情况:null 默认为最大值(即:asc 升序<小–>大>,null值排在最后...
ORDER BY last_name NULLS LAST, first_name ASC; ``` 在这个例子中,如果`last_name`为空,那么这些记录将在非空的`last_name`记录之后显示,而`first_name`则按升序排列。 总之,Oracle中的排序是一个涉及广泛的...
SELECT * FROM perexl ORDER BY danwei DESC NULLS LAST; 十一、使用 DECODE 函数对 NULL 值进行处理 在 Oracle 中,可以使用 DECODE 函数对 NULL 值进行处理。例如,以下语句将对 perexl 表中的数据按照 danwei ...
8. **分页查询**:Oracle中通常使用`ROWNUM`进行分页,但要注意`ORDER BY`和`ROWNUM`的配合使用。如果先`ORDER BY`再用`ROWNUM`,可能会导致分页结果不正确。正确的做法是: ```sql select * from ( select ...
SELECT * FROM table_name ORDER BY column_name NULLS FIRST/LAST; ``` Oracle还支持多列排序,可以同时按照多个列进行排序,先按第一列排序,再按第二列排序,以此类推。例如: ```sql SELECT * FROM table_name...
NULLS FIRST`和`ORDER BY ... NULLS LAST`可以让空值出现在排序的前面或后面。在示例中,`NULLS LAST`确保空值不会打乱其他非空值的顺序,而`NULLS FIRST`则让空值排在最前。 5. **根据数据项的键排序**:`CASE`...
通过在`ORDER BY`子句中使用`NULLS LAST/FIRST`,我们可以指定空值是排在最后还是最前。例如: ```sql SELECT region_id, customer_id, SUM(customer_sales) cust_total, RANK() OVER (PARTITION BY region_id ...
本文介绍了一种基于Struts和Hibernate实现高效分页的方法,特别是在数据库不支持分页查询的情况下。通过自定义存储过程`Ture_Page`以及正确的Hibernate配置,可以显著提高系统性能,优化用户体验。这种方法不仅适用...
这里使用`PARTITION BY dept`来定义每个部门为一个独立的分区,`ORDER BY salary DESC NULLS LAST`则指定了在每个部门内部按照薪水降序排列,并将空值排在最后。 #### 五、输出结果示例 输出结果展示了每个员工的...
在提供的`list_nulls.c`文件中,我们可能找到具体的实现细节,例如如何定义`hlist`结构体,如何初始化链表,以及如何遍历并处理空节点。这可能包括对特定宏的使用,比如Linux内核中的`hlist_for_each_entry`或`hlist...
4. **ORDER BY NULLS LAST**:在排序时,`NULLS LAST`选项确保NULL值在排序结果的最后出现,如`ORDER BY area_code, bill_month NULLS LAST`。 5. **NVL 函数家族**:NVL函数用于处理NULL值。`NVL(a,1)`当a为NULL时...
4. **ORDER BY 子句中的 NULLS LAST**:在`ORDER BY`子句中,`NULLS LAST`选项确保`NULL`值在排序时出现在最后,例如`ORDER BY area_code, bill_month NULLS LAST`。 5. **NVL 函数家族**: - `NVL(a, b)`:如果`a...
nulls_for_goals
Order子句则用于定义行的排序,可以包含ASC或DESC关键字,以及NULLS FIRST或NULLS LAST选项来控制NULL值的位置。Window子句更为复杂,它定义了分析函数的工作范围,可以基于行数(ROWS BETWEEN)或值范围(RANGE ...
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC NULLS LAST) AS dense_rank, ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC NULLS LAST) AS row_number FROM emp; ``` - **RANK()**:为...
- **语法**:`RANK() OVER (PARTITION BY <partition_by_clause> ORDER BY <order_by_clause> NULLS { FIRST | LAST })` - `PARTITION BY`子句用于将数据集分成多个分区,在每个分区内进行排名。 - `ORDER BY`子句...
在Oracle数据库中,对null值的排序以及null与空字符串的区别是数据库操作中常见的问题,尤其是在数据查询和分析时。Oracle规定,在`ORDER BY`语句执行排序时,默认情况下null被视为最大值。这意味着在升序(ASC)...