`
txf2004
  • 浏览: 6925334 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate查询方法比较

 
阅读更多

Hibernate主要有三种查询方法:

1.HQL (Hibernate Query Language)

和SQL很类似,支持分页、连接、分组、聚集函数和子查询等特性,
但HQL是面向对象的,而不是面向关系数据库中的表。正因查询语句
是面向Domain对象的,所以使用HQL可以获得跨平台的好处,Hibernate
会自动帮我们根据不同的数据库翻译成不同的SQL语句。这在需要支持
多种数据库或者数据库迁移的应用中是十分方便的。

但得到方便的同时,由于SQL语句是由Hibernate自动生成的,所以这不
利于SQL语句的效率优化和调试,当数据量很大时可能会有效率问题,
出了问题也不便于排查解决。

2.QBC/QBE (Query by Criteria/Example)

QBC/QBE是通过组装查询条件或者模板对象来执行查询的。这在需要
灵活地支持许多查询条件自由组合的应用中是比较方便的。同样的问题
是由于查询语句是自由组装的,创建一条语句的代码可能很长,并且
包含许多分支条件,很不便于优化和调试。

3.SQL

Hibernate也支持直接执行SQL的查询方式。这种方式牺牲了Hibernate跨
数据库的优点,手工地编写底层SQL语句,从而获得最好的执行效率,
相对前两种方法,优化和调试方便了一些。

下面来看一组简单的例子。
package com.cdai.orm.hibernate.query;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;

import com.cdai.orm.hibernate.annotation.Account;

public class BasicQuery {

	public static void main(String[] args) {

		SessionFactory sessionFactory = new AnnotationConfiguration().
											addFile("hibernate/hibernate.cfg.xml").				
											configure().
											addPackage("com.cdai.orm.hibernate.annotation").
											addAnnotatedClass(Account.class).
											buildSessionFactory();

		Session session = sessionFactory.openSession();

		// 1.HQL
		Query query = session.createQuery("from Account as a where a.id=:id");
		query.setLong("id", 1);
		List result = query.list();
		for (Object row : result) {
			System.out.println(row);
		}

		// 2.QBC
		Criteria criteria = session.createCriteria(Account.class);
		criteria.add(Expression.eq("id", new Long(2)));
		result = criteria.list();
		for (Object row : result) {
			System.out.println(row);
		}
		
		// 3.QBE
		Account example= new Account();
		example.setBalance(100);
		result = session.createCriteria(Account.class).
						add(Example.create(example)).
						list();
		for (Object row : result) {
			System.out.println(row);
		}
		
		// 4.SQL
		query = session.createSQLQuery(
				" select top 10 * from tb_account order by col_id desc ");
		result = query.list();
		for (Object row : result) {
			System.out.println(Arrays.toString((Object[]) row));
	}
		
		session.close();
	}

}
Hibernate: select account0_.col_id as col1_0_, account0_.col_balance as col2_0_ from tb_account account0_ where account0_.col_id=?
Account [id=1, balance=100]
Hibernate: select this_.col_id as col1_0_0_, this_.col_balance as col2_0_0_ from tb_account this_ where this_.col_id=?
Account [id=2, balance=100]
Hibernate: select this_.col_id as col1_0_0_, this_.col_balance as col2_0_0_ from tb_account this_ where (this_.col_balance=?)
Account [id=1, balance=100]
Account [id=2, balance=100]
Hibernate: select top 10 * from tb_account order by col_id desc
[2, 100]
[1, 100]

从log中可以清楚的看到Hibernate对于生成的SQL语句的控制,具体选择
哪种查询方式就要看具体应用了。

分享到:
评论

相关推荐

    hibernate查询方法

    **Hibernate查询方法大全** Hibernate,作为Java领域中最流行的持久化框架之一,提供了多种查询数据的方法。这些方法使得开发者能够高效地从数据库中检索、更新和删除数据,无需编写大量SQL语句。本篇文章将深入...

    通用的hibernate查询

    本篇文章将深入探讨通用的Hibernate查询方法,特别是关于分页查询的应用。 在Hibernate中,查询数据主要通过Criteria、HQL(Hibernate Query Language)和Query API三种方式。首先,让我们来看看Criteria查询。...

    Hibernate查询方法之探析.doc

    【Hibernate查询方法之探析】 Hibernate作为一款强大的Java持久化框架,提供了多种查询方式来适应不同的数据检索需求。本文将深入解析五种主要的Hibernate查询方法:QBE(Query By Example)、QBC(Query By ...

    Hibernate_query查询数据表中的一个字段.

    总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适的方法取决于具体需求。正确理解和使用Hibernate,能够大大提高Java开发中的数据库操作效率。

    超好用的hibernate查询工具类

    一个超好用的Hibernate查询工具类通常会封装一些常见的查询方法,例如根据ID获取单个对象、根据条件获取对象列表、分页查询等。这样的工具类可以大大减少代码重复,提高代码的可读性和可维护性。 以下是一些可能...

    Hibernate查询解决方案

    Hibernate提供的查询接口或其方法 hibernate综合查询解决方案

    hibernate常用方法集合

    让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化SessionFactory** `HibernateSessionFactory`类通过`cfg.configure(CONFIG_FILE_LOCATION)`来读取配置文件(默认为...

    struts+hibernate查询所有记录

    这是一个不错的方法,用struts hibernate实现对oracle数据库的所有数据查询、显示,其中不包含分叶问题!

    hibernate查询之HQLhibernate查询之HQL

    Hibernate查询之HQL是ORM(对象关系映射)框架Hibernate中的一个重要组成部分,它是一种面向对象的查询语言,与SQL有着显著的区别。HQL允许开发者使用类名和属性而不是表名和列名进行查询,从而更好地适应面向对象的...

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    hibernate查询详解

    hibernate查询详解 在Java开发中,Hibernate作为一款强大的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作。本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询...

    hibernate 模糊查询 分页

    本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...

    Hibernate的高级查询

    通过这些高级查询方法,我们可以更灵活地操作数据库,处理复杂的数据关联。无论是在HQL中编写复杂的查询语句,还是使用Criteria API和Criteria Builder构造动态查询,都能显著提高开发效率并减少错误。对于处理一对...

    hibernate里面的 两种查询

    这两种查询方法各有特点,适用于不同的场景,使得开发者可以根据实际需求灵活选择。 1. Hibernate Criteria API: Criteria API 是Hibernate提供的一种面向对象的查询方式,它允许开发者通过构建对象来表示查询条件...

    hibernate实现递归查询

    本文将深入探讨如何使用Hibernate实现递归查询,以解决在数据层次结构中涉及父节点与子节点关系时的问题。递归查询通常用于处理树形结构的数据,例如组织结构、菜单系统或者文件目录等。 首先,我们需要了解递归的...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    Hibernate中查询语句

    Hibernate中的查询方法若HQL,详细讲解HQL与使用的具体例子

    Hibernate在查询条件中创建List集合

    本文将深入探讨如何在Hibernate中利用查询条件创建List集合,这在处理复杂的数据筛选和聚合时尤其有用。 首先,让我们理解在Hibernate中创建List集合的基本概念。List集合是Java集合框架的一部分,它可以存储有序且...

    hibernate 数据库操作方法

    一、Hibernate查询机制 Hibernate提供了三种主要的查询方式:SQL、HQL(Hibernate Query Language)和QBC(Query by Criteria)。 1. SQL查询: Hibernate支持直接执行SQL语句,这使得开发者可以充分利用数据库的...

    hibernate查询缓存1

    在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...

Global site tag (gtag.js) - Google Analytics