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);