日期:2014-05-16 浏览次数:20858 次
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);
?