对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式:
List cats = sess.createSQLQuery( " select * from cats " ).addEntity(Cat. class ).list();
这个查询指定了:
SQL查询字符串
查询返回的实体
这里,结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询,这就可能造成问题,因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:
List cats = sess.createSQLQuery( " select {cat.*} from cats cat " ).addEntity( " cat " , Cat. class ).list();
这个查询指定了:
SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名.
查询返回的实体,和它的SQL表的别名.
addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。
addJoin()方法可以被用于载入其他的实体和集合的关联.
List cats = sess.createSQLQuery(
" select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id " )
.addEntity( " cat " , Cat. class )
.addJoin( " kitten " , " cat.kittens " )
.list();
原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。
Double max = (Double) sess.createSQLQuery( " select max(cat.weight) as maxWeight from cats cat " )
.addScalar( " maxWeight " , Hibernate.DOUBLE);
.uniqueResult();
除此之外,你还可以在你的hbm文件中描述结果集映射信息,在查询中使用。
List cats = sess.createSQLQuery(
" select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id " )
.setResultSetMapping( " catAndKitten " )
.list();
命名SQL查询
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不需要调用addEntity()方法.
< sql - query name = " persons " >
< return alias = " person " class = " eg.Person " />
Select person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex} FROM PERSON person Where person.NAME LIKE :namePattern
</ sql - query >
List people = sess.getNamedQuery( " persons " ).setString( " namePattern " , namePattern)
.setMaxResults( 50 )
.list();
分享到:
相关推荐
本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1. **使用`Session.createSQLQuery()`** Hibernate的`Session`接口提供了`createSQLQuery()`方法,允许我们直接编写SQL...
学习 Hibernate 的基础用法,主要涵盖以下几个方面: 1. **配置**:创建 `hibernate.cfg.xml` 配置文件,指定数据库连接信息、方言、缓存策略等。也可以使用 Java 配置方式进行配置。 2. **实体映射**:定义实体类...
例如,在`findAllbyString`方法中,使用了`getSession().createSQLQuery`方法来执行原生SQL查询: ```java String queryString = "Select * from h_attribute t where ciid=24 and Isinstance=1 and Isdisplay=1"; ...
在Hibernate中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **Native SQL** 本文将重点介绍如何使用HQL和Native SQL来实现多表联合查询。 #### 三、...
本文将详细介绍 Hibernate 提供的几种查询方式及其应用场景。 #### 二、重要知识点 ##### 1. Session 对象与查询操作 在 Hibernate 中,所有持久化操作都需要通过 Session 对象来完成,包括查询操作。Session ...
根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...
本文将详细介绍如何解决这一问题,并提供几种有效的解决方案。 #### 问题背景 Hibernate是Java平台下的一款优秀对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互过程。然而,在使用...
5. **HQL与SQL查询**: Hibernate提供了自己的查询语言HQL,但Access支持的SQL特性有限,因此可能需要编写原生SQL查询并使用`Session`的`createSQLQuery()`方法执行。 6. **优化与注意事项**: 由于Access的性能和...
这通常涉及到在HQL中嵌入SQL片段,或者使用`createSQLQuery`方法直接执行SQL查询。同时,别忘了映射查询结果到对应的Java对象。 4. **max分页**: 提到的`max分页`可能是指在某些场景下,我们需要知道总共有多少页...
`find()`方法可以进行简单的SQL查询,而`createQuery()`和`createSQLQuery()`则支持更复杂的HQL(Hibernate Query Language)和原生SQL查询。 7. **事务管理**:在执行增删改查操作时,通常需要包裹在事务中以确保...
以上介绍了Hibernate中几种常见的查询方式,包括HQL、QBC、原生SQL以及一些高级查询技巧如分组、排序等。掌握这些基本操作可以帮助开发者更高效地使用Hibernate框架进行数据访问操作。随着实践经验的积累,还可以...
4. **查询**:使用Session的createQuery或createSQLQuery方法创建HQL或SQL查询,然后设置参数并执行。 5. **结果处理**:HQL查询返回的结果可以是List对象,其中包含了查询结果对应的Java对象。 总的来说,...
Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个元素开始获取,MaxResults...
下面是几种常见的查询优化策略: 4.1 使用缓存 Hibernate 提供了多种缓存机制,例如一级缓存、二级缓存和查询缓存等。这些缓存机制可以显著地提高查询性能。 4.2 优化 HQL 查询 HQL 查询可以通过使用索引、限制...
在使用Hibernate执行SQL查询时,我们通常有以下几种方式: 1. HQL(Hibernate Query Language):这是Hibernate专有的查询语言,语法类似于SQL,但面向对象。例如,我们可以用`from Customer`来获取所有Customer...
针对上述问题,可以采取以下几种解决策略: ##### 1. 正确配置 Hibernate 映射文件 确保在 Hibernate 的映射文件(如 `.hbm.xml`)或注解中明确指定 `char` 类型字段的映射规则。例如,可以使用 `<property>` 元素...
- **`jdbcTemplate.queryForList`**:通常用于执行JDBC级别的查询,效率介于上述几种方法之间。 在实际应用中,可以根据具体的查询需求选择最合适的查询方式,以达到最优的性能。 #### 四、选择正确的批量处理方法...
Hibernate 包含以下几个主要组件: 1. **Configuration**:负责读取配置文件,初始化SessionFactory。 2. **SessionFactory**:是所有Session的工厂,它是一个线程安全的类,应用中只需要一个SessionFactory实例。 ...