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);
分享到:
相关推荐
下面将详细探讨如何在Hibernate中使用Access。 首先,理解Hibernate的核心概念。Hibernate提供了一种映射机制,将Java对象与数据库表对应,通过XML配置文件(或注解)定义这种映射关系。在使用Access之前,我们需要...
在本篇文章中,我们将深入探讨Hibernate的查询机制,以及如何通过`hibernate.cfg.xml`配置文件来设置和管理数据库连接。 首先,让我们来看看Hibernate的核心配置文件`hibernate.cfg.xml`。这个文件是Hibernate与...
在这个小实例中,我们将探讨如何使用Hibernate与MySQL数据库进行交互。MySQL是一个广泛使用的开源关系型数据库管理系统,其简洁、高效的特点使其成为开发者的首选。 首先,让我们了解Hibernate的核心概念: 1. **...
在这个“Hibernate资源”中,我们将深入探讨Hibernate的基础使用和如何与MySQL数据库进行集成。 首先,让我们了解什么是持久化类。在Hibernate中,持久化类是代表数据库表的Java类。它们包含了属性,这些属性对应于...
3. `Query`: `Session`的`createQuery()`方法用于构建HQL(Hibernate Query Language)查询,或者`createSQLQuery()`方法用于构建原生SQL查询。 4. `Criteria API**: 另一种查询方式,提供更面向对象的查询,避免硬...
例如,使用`org.hibernate.boot.model.naming.PhysicalNamingStrategy`接口来自定义表名生成策略,或者利用`Session.createSQLQuery()`方法直接执行原生SQL。 2. **多数据库支持**:为了适应不同的数据库,如MySQL...
在本教程中,我们将探讨如何在实际项目中使用Hibernate进行数据库操作,通过一个完整的实例来展示其核心功能。 1. **环境配置** - **JDK**: 首先确保你的系统已经安装了Java开发工具包(JDK),并设置了相应的环境...
2. **查询(Read)**:使用`Session`的`get()`或`load()`方法获取对象,或者使用`createQuery()`或`createSQLQuery()`方法执行HQL(Hibernate Query Language)或SQL查询。 ```java Student student = session.get...
在MySQL中,创建和调用存储过程的语法与其他数据库系统略有不同。例如,创建一个接受两个参数并返回结果的存储过程如下: ```sql DELIMITER // CREATE PROCEDURE my_stored_procedure(IN param1 INT, IN param2 ...
标题中的“HIBERNATE3.6 MYSQL无错版配置文件及主程序范例”意味着我们将探讨关于Hibernate 3.6版本与MySQL数据库的集成配置,以及如何编写一个无错误的主程序示例。这个主题涵盖了Java持久层框架Hibernate的核心...
在Java应用程序中,Hibernate使得数据操作更加简洁高效,避免了传统的JDBC代码繁琐和易出错的问题。HQL(Hibernate Query Language)是Hibernate框架内建的一种面向对象的查询语言,类似于SQL,但更贴近于Java对象。...
在Java开发中,Hibernate是一个流行的持久层框架,它简化了数据库操作,包括调用MySQL中的存储过程和函数。本篇将详细讲解如何使用Hibernate调用MySQL的存储过程和函数。 首先,调用MySQL的函数通常涉及到`...
21.3.1 在mysql.exe程序中设置隔离级别 21.3.2 在应用程序中设置隔离级别 21.4 在应用程序中采用悲观锁 21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现悲观锁 21.5 利用Hibernate的...
为了开始使用Hibernate,我们需要在项目中引入Hibernate的依赖库。这通常通过Maven或Gradle等构建工具来完成,添加相应的依赖项到pom.xml或build.gradle文件中。确保包含Hibernate的核心库、JDBC驱动(对应你的...
3. **调用存储过程**:在Java代码中,你可以通过SessionFactory获取Session对象,然后使用`Session.createSQLQuery()`或`Session.doWork()`方法来执行存储过程。例如: ```java Session session = sessionFactory...
使用Session的`get()`或`load()`方法可以查询特定ID的对象,而`createQuery()`或`createSQLQuery()`则支持更复杂的查询。 #### 更新(Update) 当对象的属性发生变化时,调用Session的`update()`方法将更新数据库中...
如果需要更复杂的模糊查询,如音译搜索,可以使用数据库特有的SQL函数,如MySQL的`SOUNDEX`,通过`DetachedCriteria`或`Session.CreateSQLQuery`来执行。 2. **自定义HQL** 对于Nhibernate不直接支持的模糊查询...
比如在MySQL中,可以使用LIMIT和OFFSET: ```java Session session = sessionFactory.openSession(); String sql = "SELECT * FROM user LIMIT :startIndex, :pageSize"; SQLQuery query = session.createSQLQuery...
在MySQL中,可以使用以下语句: ```sql CREATE PROCEDURE proc() BEGIN SELECT * FROM proctab; END; ``` 接下来,我们讨论如何通过Hibernate的不同方式来调用这个存储过程。 1. **使用XML映射文件**:在...
可以结合HQL与Criteria,使用`createSQLQuery`方法执行自定义的SQL查询,并通过`setResultTransformer`转换结果。 10. 缓存机制 Hibernate支持一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。二...