`

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

 

2
0
分享到:
评论

相关推荐

    Hibernate中使用Access

    下面将详细探讨如何在Hibernate中使用Access。 首先,理解Hibernate的核心概念。Hibernate提供了一种映射机制,将Java对象与数据库表对应,通过XML配置文件(或注解)定义这种映射关系。在使用Access之前,我们需要...

    hibernate查询代码

    在本篇文章中,我们将深入探讨Hibernate的查询机制,以及如何通过`hibernate.cfg.xml`配置文件来设置和管理数据库连接。 首先,让我们来看看Hibernate的核心配置文件`hibernate.cfg.xml`。这个文件是Hibernate与...

    HibernateDemo Hibernate小实例

    在这个小实例中,我们将探讨如何使用Hibernate与MySQL数据库进行交互。MySQL是一个广泛使用的开源关系型数据库管理系统,其简洁、高效的特点使其成为开发者的首选。 首先,让我们了解Hibernate的核心概念: 1. **...

    Hibernate资源

    在这个“Hibernate资源”中,我们将深入探讨Hibernate的基础使用和如何与MySQL数据库进行集成。 首先,让我们了解什么是持久化类。在Hibernate中,持久化类是代表数据库表的Java类。它们包含了属性,这些属性对应于...

    Hibernate简单的demo

    3. `Query`: `Session`的`createQuery()`方法用于构建HQL(Hibernate Query Language)查询,或者`createSQLQuery()`方法用于构建原生SQL查询。 4. `Criteria API**: 另一种查询方式,提供更面向对象的查询,避免硬...

    hibernate动态数据库进化版

    例如,使用`org.hibernate.boot.model.naming.PhysicalNamingStrategy`接口来自定义表名生成策略,或者利用`Session.createSQLQuery()`方法直接执行原生SQL。 2. **多数据库支持**:为了适应不同的数据库,如MySQL...

    使用Hibernate的一个完整例子

    在本教程中,我们将探讨如何在实际项目中使用Hibernate进行数据库操作,通过一个完整的实例来展示其核心功能。 1. **环境配置** - **JDK**: 首先确保你的系统已经安装了Java开发工具包(JDK),并设置了相应的环境...

    hibernate实现增删改查

    2. **查询(Read)**:使用`Session`的`get()`或`load()`方法获取对象,或者使用`createQuery()`或`createSQLQuery()`方法执行HQL(Hibernate Query Language)或SQL查询。 ```java Student student = session.get...

    hibernate调用存储过程

    在MySQL中,创建和调用存储过程的语法与其他数据库系统略有不同。例如,创建一个接受两个参数并返回结果的存储过程如下: ```sql DELIMITER // CREATE PROCEDURE my_stored_procedure(IN param1 INT, IN param2 ...

    HIBERNAT3.6 MYSQL无错版配置文件及主程序范例

    标题中的“HIBERNATE3.6 MYSQL无错版配置文件及主程序范例”意味着我们将探讨关于Hibernate 3.6版本与MySQL数据库的集成配置,以及如何编写一个无错误的主程序示例。这个主题涵盖了Java持久层框架Hibernate的核心...

    hibernate的HQL的jar

    在Java应用程序中,Hibernate使得数据操作更加简洁高效,避免了传统的JDBC代码繁琐和易出错的问题。HQL(Hibernate Query Language)是Hibernate框架内建的一种面向对象的查询语言,类似于SQL,但更贴近于Java对象。...

    java-hibernate调用mysql过程和函数的方式.pdf

    在Java开发中,Hibernate是一个流行的持久层框架,它简化了数据库操作,包括调用MySQL中的存储过程和函数。本篇将详细讲解如何使用Hibernate调用MySQL的存储过程和函数。 首先,调用MySQL的函数通常涉及到`...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     21.3.1 在mysql.exe程序中设置隔离级别  21.3.2 在应用程序中设置隔离级别  21.4 在应用程序中采用悲观锁  21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现悲观锁  21.5 利用Hibernate的...

    hibernate搭建基础demo

    为了开始使用Hibernate,我们需要在项目中引入Hibernate的依赖库。这通常通过Maven或Gradle等构建工具来完成,添加相应的依赖项到pom.xml或build.gradle文件中。确保包含Hibernate的核心库、JDBC驱动(对应你的...

    hibernate 3.1 存储过程

    3. **调用存储过程**:在Java代码中,你可以通过SessionFactory获取Session对象,然后使用`Session.createSQLQuery()`或`Session.doWork()`方法来执行存储过程。例如: ```java Session session = sessionFactory...

    学习hibernate的简单例子(源码)

    使用Session的`get()`或`load()`方法可以查询特定ID的对象,而`createQuery()`或`createSQLQuery()`则支持更复杂的查询。 #### 更新(Update) 当对象的属性发生变化时,调用Session的`update()`方法将更新数据库中...

    Nhibernate的模糊查询

    如果需要更复杂的模糊查询,如音译搜索,可以使用数据库特有的SQL函数,如MySQL的`SOUNDEX`,通过`DetachedCriteria`或`Session.CreateSQLQuery`来执行。 2. **自定义HQL** 对于Nhibernate不直接支持的模糊查询...

    hibernate的分页

    比如在MySQL中,可以使用LIMIT和OFFSET: ```java Session session = sessionFactory.openSession(); String sql = "SELECT * FROM user LIMIT :startIndex, :pageSize"; SQLQuery query = session.createSQLQuery...

    Hibernate --调用存储过程(全).docx

    在MySQL中,可以使用以下语句: ```sql CREATE PROCEDURE proc() BEGIN SELECT * FROM proctab; END; ``` 接下来,我们讨论如何通过Hibernate的不同方式来调用这个存储过程。 1. **使用XML映射文件**:在...

    hibernate各种操作

    可以结合HQL与Criteria,使用`createSQLQuery`方法执行自定义的SQL查询,并通过`setResultTransformer`转换结果。 10. 缓存机制 Hibernate支持一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。二...

Global site tag (gtag.js) - Google Analytics