日期:2014-05-16  浏览次数:20858 次

Hibernate中使用CreateSQLQuery查询mysql的问题

Hibernate中有三种SQL的查询方式:

1. HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。

使用Query接口是使用HQL查询的入口。例如:

Query q = session.createQuery("from User u where u.firstname = :fname");
q.setString("fname", "Max");
List result = q.list();

?

2.QBC 通过条件查询(Query by Criteria)

Hibernate的通过条件查询(query by criteria(QBC))API 允许你在运行时通过操纵查询对
象来建立查询。这种方法允许动态的指定约束而不是直接操纵字符串,但是,它也丢掉了许
多HQL的复杂性或强大功能。另一方面,以条件表示的查询比以HQL表示的查询可读性差。
通过名字检索用户使用查询对象更简单:

Criteria criteria = session.createCriteria(User.class);
criteria.add( Expression.like("firstname", "Max") );
List result = criteria.list();

?3.使用原生SQL的查询.使用:CreateSQLQuery(这才是主要的话题...^^)

?? 使用CreateSQLQuery是原生的SQL语句,如果没有进行对象的转换,它的结果值将返回的是对象数组。也可以在执行SQL后直接转成对象。

????

List<List<Object>> result = new ArrayList<List<Object>>();
		Iterator it = sqlList.list().iterator();
		while (it.hasNext()) {
	                          List<Object> rowList = new ArrayList<Object>();
		          if (fields.length > 1) {// fieldSize > 1
			Object[] os = (Object[]) it.next();//每行结果都是一个数组对象
........................

?

在MySql中因为数据类型的问题就会出现严重:

Servlet.service() for servlet action threw exception org.hibernate.MappingException:

No Dialect mapping for JDBC type?-4 at org.hibernate.dialect.TypeNames.get(TypeNames.java:56) at org.hibernate.dialect.TypeNames.get(TypeNames.java:81) at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370) at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader...等异常。

这是由于mysql(BLOB,text)类型在JDBC返回的数据类型没有注册,解决的方法如下:

?1.? 重写mysql的方言

????

public class CrtMySQLDialect extends MySQLDialect { 
                   public CrtMySQLDialect() { 
                         super(); 
                         registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName()); //对应mysql的text 
                         registerHibernateType(-4, Hibernate.BLOB.getName()); 
                          //-4就是错误的type number 在mysql对应XXXBlob忘记了名字^^
                          } 
}

?2.在hibernate设置SQL方言的XML文件中将类替换成此上面MySQLDialect 的路径

再试试...是不是?问题解决了....呵

?

:hibernate当然还有其它的查询方式:如QBE

?? 通过例子查询(Query by example)

User exampleUser = new User();
exampleUser.setFirstname("Max");
Criteria criteria = session.createCriteria(User.class);
criteria.add( Example.create(exampleUser) );
List result = criteria.list();

?

再如:根据标识符检索对象?

User user = (User) session.get(User.class, userID);
//或者User user = (User) session.load(User.class, userID);

?