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语句的控制,具体选择
哪种查询方式就要看具体应用了。

原文地址:https://www.cnblogs.com/xiaomaohai/p/6157820.html