• 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
Copyright © 2020-2023  润新知