- 浏览: 264794 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (109)
- 学习脚步~hibernate里关于删除与事务的关系小发现 (0)
- 学习脚步~mysql数据库字段发现 (0)
- 学习脚步~hibernate输出的sql日志里匹配上传进去的参数 (0)
- hibernate (11)
- java (6)
- mysql (5)
- Eclipse (1)
- Android (3)
- 网络探针 (1)
- html解析 (1)
- oracle (3)
- struts (5)
- plsql (1)
- HttpClient (1)
- MyEclipse (1)
- struts2 (7)
- mysql&hibernate (1)
- mysql+hibernate+struts (1)
- struts2+mysql (1)
- hibernate+struts2 (1)
- mysql + hibernate (1)
- hibernate + mysql + hql (1)
- commons组件学习 (1)
- JavaScript (2)
- js+css (1)
- 开发工具 (1)
- 树状菜单Jquery+dtree+json (1)
- hibernate+mysql (1)
- struts2+html (1)
- 浏览器兼容 (3)
- struts+Preparable (1)
- Jfreechart (1)
- html+js (2)
- js (3)
- prototype.js+ajax (1)
- popup (1)
- Jquery (1)
- 遇到的问题 (1)
- DWR (3)
- poi+下载文件 (1)
- 纯属扯淡 (3)
- 软件下载 (1)
- xp系统 (1)
- 星座 (0)
- svn (2)
- 测试 (1)
- 各种jar包 (0)
- 纯属扯淡 2012-10-18 (0)
最新评论
-
maqiang88:
hao xiexie
学习脚步--- HttpClient4.0 -
qq970836452:
[/flash][*][*]||||||||||||[*]|| ...
学习脚步--- FusionCharts的研究 (转载) -
qq970836452:
[flash=200,200][flash=200,200][ ...
学习脚步--- FusionCharts的研究 (转载) -
qq970836452:
引用[u][/u]引用
学习脚步--- FusionCharts的研究 (转载) -
qq970836452:
[flash=200,200][url][img][list] ...
学习脚步--- FusionCharts的研究 (转载)
最近使用mysql做一个交易网站,使用hibernate作为持久化框架。
当我使用hibernate的Order进行排序的时候,杯具发生了。中文给我乱排了。
mysql中如果需要正常按照中文排序,其中一种处理方法是
SELECT * FROM BZ_COMPANY ORDER BY CONVERT( COMPANY_NAME USING GBK ) ASC
可问题是这样就脱离hibernate了。本打算使用QBC做一些公共的方法的。
然后就去看了下hibernate中Order的实现。
hibernate的Order:
- //$Id: Order.java,v 1.1 2011/05/29 18:11:15 Surui Exp $
- package org.hibernate.criterion;
- import java.io.Serializable;
- import java.sql.Types;
- import org.hibernate.Criteria;
- import org.hibernate.HibernateException;
- import org.hibernate.engine.SessionFactoryImplementor;
- import org.hibernate.type.Type;
- /**
- * Represents an order imposed upon a <tt>Criteria</tt> result set
- * @author Gavin King
- */
- public class Order implements Serializable {
- private boolean ascending;
- private boolean ignoreCase;
- private String propertyName;
- public String toString() {
- return propertyName + ' ' + (ascending?"asc":"desc");
- }
- public Order ignoreCase() {
- ignoreCase = true;
- return this;
- }
- /**
- * Constructor for Order.
- */
- protected Order(String propertyName, boolean ascending) {
- this.propertyName = propertyName;
- this.ascending = ascending;
- }
- /**
- * Render the SQL fragment
- *
- */
- public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
- throws HibernateException {
- String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
- Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
- StringBuffer fragment = new StringBuffer();
- for ( int i=0; i<columns.length; i++ ) {
- SessionFactoryImplementor factory = criteriaQuery.getFactory();
- boolean lower = ignoreCase && type.sqlTypes( factory )[i]==Types.VARCHAR;
- if (lower) {
- fragment.append( factory.getDialect().getLowercaseFunction() )
- .append('(');
- }
- fragment.append( columns[i] );
- if (lower) fragment.append(')');
- fragment.append( ascending ? " asc" : " desc" );
- if ( i<columns.length-1 ) fragment.append(", ");
- }
- return fragment.toString();
- }
- /**
- * Ascending order
- *
- * @param propertyName
- * @return Order
- */
- public static Order asc(String propertyName) {
- return new Order(propertyName, true);
- }
- /**
- * Descending order
- *
- * @param propertyName
- * @return Order
- */
- public static Order desc(String propertyName) {
- return new Order(propertyName, false);
- }
- }
//$Id: Order.java,v 1.1 2011/05/29 18:11:15 Surui Exp $ package org.hibernate.criterion; import java.io.Serializable; import java.sql.Types; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.type.Type; /** * Represents an order imposed upon a <tt>Criteria</tt> result set * @author Gavin King */ public class Order implements Serializable { private boolean ascending; private boolean ignoreCase; private String propertyName; public String toString() { return propertyName + ' ' + (ascending?"asc":"desc"); } public Order ignoreCase() { ignoreCase = true; return this; } /** * Constructor for Order. */ protected Order(String propertyName, boolean ascending) { this.propertyName = propertyName; this.ascending = ascending; } /** * Render the SQL fragment * */ public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName); Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName); StringBuffer fragment = new StringBuffer(); for ( int i=0; i<columns.length; i++ ) { SessionFactoryImplementor factory = criteriaQuery.getFactory(); boolean lower = ignoreCase && type.sqlTypes( factory )[i]==Types.VARCHAR; if (lower) { fragment.append( factory.getDialect().getLowercaseFunction() ) .append('('); } fragment.append( columns[i] ); if (lower) fragment.append(')'); fragment.append( ascending ? " asc" : " desc" ); if ( i<columns.length-1 ) fragment.append(", "); } return fragment.toString(); } /** * Ascending order * * @param propertyName * @return Order */ public static Order asc(String propertyName) { return new Order(propertyName, true); } /** * Descending order * * @param propertyName * @return Order */ public static Order desc(String propertyName) { return new Order(propertyName, false); } }
重点就在toSqlString上了,QBC的Criteria也是toSqlString产生对应sql的,所以只要在这里做手脚,就能达到效果。
当然,不赞成直接改源码。
然后就有了GBKOrder:
- package comm;
- import java.sql.Types;
- import org.hibernate.Criteria;
- import org.hibernate.HibernateException;
- import org.hibernate.criterion.CriteriaQuery;
- import org.hibernate.criterion.Order;
- import org.hibernate.engine.SessionFactoryImplementor;
- import org.hibernate.type.Type;
- public class GBKOrder extends Order {
- private String encoding = "GBK";
- private boolean ascending;
- private boolean ignoreCase;
- private String propertyName;
- @Override
- public String toString() {
- return "CONVERT( " + propertyName + " USING " + encoding + " ) " + (ascending ? "asc" : "desc");
- }
- @Override
- public Order ignoreCase() {
- ignoreCase = true;
- return this;
- }
- /**
- * Constructor for Order.
- */
- protected GBKOrder(String propertyName, boolean ascending) {
- super(propertyName, ascending);
- this.propertyName = propertyName;
- this.ascending = ascending;
- }
- /**
- * Constructor for Order.
- */
- protected GBKOrder(String propertyName, String dir) {
- super(propertyName, dir.equalsIgnoreCase("ASC") ? true : false);
- ascending = dir.equalsIgnoreCase("ASC") ? true : false;
- this.propertyName = propertyName;
- this.ascending = ascending;
- }
- /**
- * Render the SQL fragment
- *
- */
- @Override
- public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
- String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
- Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
- StringBuffer fragment = new StringBuffer();
- for (int i = 0; i < columns.length; i++) {
- SessionFactoryImplementor factory = criteriaQuery.getFactory();
- boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR;
- if (lower) {
- fragment.append(factory.getDialect().getLowercaseFunction()).append('(');
- }
- fragment.append("CONVERT( " + columns[i] + " USING " + encoding + " )");
- if (lower)
- fragment.append(')');
- fragment.append(ascending ? " asc" : " desc");
- if (i < columns.length - 1)
- fragment.append(", ");
- }
- return fragment.toString();
- }
- /**
- * Ascending order
- *
- * @param propertyName
- * @return Order
- */
- public static Order asc(String propertyName) {
- return new GBKOrder(propertyName, true);
- }
- /**
- * Descending order
- *
- * @param propertyName
- * @return Order
- */
- public static Order desc(String propertyName) {
- return new GBKOrder(propertyName, false);
- }
- }
package comm; import java.sql.Types; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.criterion.CriteriaQuery; import org.hibernate.criterion.Order; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.type.Type; public class GBKOrder extends Order { private String encoding = "GBK"; private boolean ascending; private boolean ignoreCase; private String propertyName; @Override public String toString() { return "CONVERT( " + propertyName + " USING " + encoding + " ) " + (ascending ? "asc" : "desc"); } @Override public Order ignoreCase() { ignoreCase = true; return this; } /** * Constructor for Order. */ protected GBKOrder(String propertyName, boolean ascending) { super(propertyName, ascending); this.propertyName = propertyName; this.ascending = ascending; } /** * Constructor for Order. */ protected GBKOrder(String propertyName, String dir) { super(propertyName, dir.equalsIgnoreCase("ASC") ? true : false); ascending = dir.equalsIgnoreCase("ASC") ? true : false; this.propertyName = propertyName; this.ascending = ascending; } /** * Render the SQL fragment * */ @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName); Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName); StringBuffer fragment = new StringBuffer(); for (int i = 0; i < columns.length; i++) { SessionFactoryImplementor factory = criteriaQuery.getFactory(); boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR; if (lower) { fragment.append(factory.getDialect().getLowercaseFunction()).append('('); } fragment.append("CONVERT( " + columns[i] + " USING " + encoding + " )"); if (lower) fragment.append(')'); fragment.append(ascending ? " asc" : " desc"); if (i < columns.length - 1) fragment.append(", "); } return fragment.toString(); } /** * Ascending order * * @param propertyName * @return Order */ public static Order asc(String propertyName) { return new GBKOrder(propertyName, true); } /** * Descending order * * @param propertyName * @return Order */ public static Order desc(String propertyName) { return new GBKOrder(propertyName, false); } }
发表评论
-
Hibernate3.x openSession()与getCurrentSession()得到的连接的区别 (转载)
2011-12-12 11:03 4445转载自:http://blog.csdn.net/fishru ... -
hibernate里的级联条件查询
2011-11-08 17:29 1567public int getCount(long user, ... -
在IE浏览器里,使用tr的innerHTML不管用的解决方案(原创)
2011-09-26 17:49 2408程序一个bug: 点击 ... -
hibernate里的findByExample(原创)
2011-09-15 17:48 3582之前做开发是用公司的框架,很多东西都是别人包装好的。所以,很多 ... -
Hibernate中Criteria的完整用法 (转)
2011-09-15 11:24 863Hibernate中Criteria的完整用法 最近在项目 ... -
hibernate里的delete操作
2011-09-07 15:24 2957发现一个奇怪的现象:使用下面的方法进行删除一个表里全部数据的操 ... -
hibernate反向工程后findByExample的发现
2011-09-07 15:15 1104今天 public void testFindByExam ... -
hibernate如何反向工程的详细步骤(原创)
2011-09-07 15:05 4643步骤一:window-->open Perspectiv ... -
hibernate输出的sql日志里匹配上传进去的参数(原创)
2011-09-05 16:35 4410hibernate在hibernate.cfg.xml里配置了 ... -
hibernate里关于删除与事务的关系小发现(自学笔记)
2011-08-23 14:30 1455一、 今天在使用hibernate的反向工程的时候 发现这 ...
相关推荐
在这个例子中,`@OrderBy`注解使得Hibernate在查询`Article`时,根据`title`字段的GBK中文排序规则进行排序。 另外,提供的`GBKOrder.java`文件可能是实现自定义排序策略的类。在Hibernate中,可以通过实现`...
Hibernate中对表某个字段排序,直接在配置里面实现排序功能。
论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...
《Hibernate中文参考手册》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate的中文API及详尽的参考信息。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对...
**基于Struts 2和Hibernate的Blog实现** 在IT领域,构建一个博客系统是常见的实践项目,用于学习和展示Web开发技术。本项目利用Struts 2和Hibernate这两个流行的Java框架,实现了一个基本的博客系统。Struts 2是MVC...
标题“hibernate中文参考文档”意味着该文档是一份面向中文用户的Hibernate框架的参考资料,旨在为开发者提供详细的技术指导和用法说明。从描述来看,这份文档内容涵盖了Hibernate框架的主要特性和用法,从基础的...
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于应用的依赖管理和持久层操作。本项目"Spring+Hibernate实现用户登录"旨在演示如何整合这两个框架,构建一个能够处理用户登录功能的Web应用程序。...
2. **HIBERNATE - Relational Persistence for Idiomatic Java.pdf**:这本书可能详细介绍了Hibernate如何实现Java中的关系数据持久化,可能会包含最佳实践和示例代码。 3. **Hibernate 中文API文档.chm**:这是...
在IT行业中,Web开发是关键领域之一,而Struts和Hibernate是两个非常重要的框架,用于构建动态、数据驱动的Web应用程序。在这个实例中,我们将深入探讨如何利用这两个框架实现用户注册功能,即向数据库中插入一条新...
总之,Hibernate中文API最新参考文档将帮助开发者掌握如何利用Hibernate的各类功能,实现高效、灵活的数据库操作,提升Java应用程序的开发效率和质量。通过深入学习和实践,开发者可以熟练地运用Hibernate解决实际...
《Hibernate中文参考文档》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate 3.6.10版本的相关内容。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在Java应用程序...
网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring...
本教程将通过模拟Hibernate的实现原理,帮助开发者深入理解其工作方式,以便更好地运用到实际项目中。 **一、Hibernate概述** Hibernate是一个开源的ORM框架,它提供了一种在Java应用中持久化对象到关系数据库的...
对于简单的查询场景,使用HQL(Hibernate Query Language)即可轻松实现排序功能;但对于复杂的多表关联查询场景,则需要借助Criteria API来灵活构建查询条件。本文将围绕给定的代码片段,深入探讨Hibernate ...
在这个项目中,“struts2+hibernate+mysql实现注册登录”是一个基础的实战教程,旨在帮助新手理解如何在实际应用中整合这三个技术。 **Struts2** 是一个强大的MVC框架,它负责处理HTTP请求,控制应用程序的流程,并...
在这个案例中,我们使用了Java服务器页面(JSP)作为视图层,Hibernate作为持久层框架来处理数据库操作,实现了留言板的功能。下面我们将深入探讨这两个技术及其在留言板应用中的具体应用。 **1. JSP(Java Server ...
在“Hibernate中文文档 HTML格式”中,这些概念和使用方法都将以易于理解的方式呈现,适合初学者和有经验的开发者参考学习。通过阅读这份文档,你将能够深入理解Hibernate的工作原理,并学会如何在实际项目中有效...
### Hibernate 3.2中文手册知识点汇总 #### 第1章:Hibernate入门 - **1.1 前言** - 介绍了Hibernate的基本概念及其重要性。 - 强调了学习Hibernate对于Java开发人员的重要性。 - **1.2 第一部分—第一个...
《Hibernate 3.6 中文 CHM》是一个针对...以上只是《Hibernate 3.6 中文 CHM》文档中部分关键知识点的概述。通过深入学习和实践,开发者可以充分利用Hibernate的强大功能,提高开发效率,降低数据库操作的复杂性。
在Hibernate中,使用`Criteria`进行查询时,可以通过添加排序条件来对结果集进行排序。`Criteria`提供了一个非常灵活的方式来实现这一点。 **示例代码**: ```java Criteria criteria = session.createCriteria...