• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Hibernate中使用CreateSQLQuery查询mysql的有关问题

mysql 搞代码 7年前 (2018-06-04) 140次浏览 已收录 0个评论

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

欢迎大家阅读《Hibernate中使用CreateSQLQuery查询mysql的有关问题》,跪求各位点评,by 搞代码

 

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

 


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Hibernate中使用CreateSQLQuery查询mysql的有关问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址