首页 > 经验记录 > hibernate的HQL、Criteria、标准SQL三种查询方式实现、对比、解析

hibernate的HQL、Criteria、标准SQL三种查询方式实现、对比、解析

 
HQL:
HQL(Hibernate Query Language)是hibernate专门用于查询数据的语句,有别于SQL,HQL 更接近于面向对象的思维方式。
比如使用的是类的名字而非表格的名字
使用流程:
1. 首先根据hql(createQuery() )创建一个Query对象
2. 设置参数(和基1的PreparedStatement不一样,Query是基0的)
3. 通过Query对象的list()方法即返回查询的结果了。
 
Criteria
使用Criteria进行数据查询。
与HQL和Criteria的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有任何sql语句的痕迹
使用流程:
1. 通过session的createCriteria创建一个Criteria 对象
2. Criteria.add 增加约束。 在这儿增加一个对name的模糊查询(like)
3. 调用list()方法返回查询结果的集合
 
标准SQL查询
通过标准SQL语句进行查询
Hibernate依然保留了对标准SQL语句的支持,在一些场合不好使用HQL和Criteria时,比如多表联合查询。就可以用标准SQL语句自己写。
 
由于标准SQL语句可能返回各种结果,hibernate也不知道你写了个啥,所以返回值是一个List<Object[]>List中的每一个对象数组代表一行数据,对象数组中的每一个对象代表该行每一列的数据
所以要取出所有的数据的话,需要进行嵌套for循环
 
下面是三种查询方式的代码:

package top.yibobo.test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import top.yibobo.entity.Product;
public class TestHibernate2 {
	public static void main(String[] args) {
		//testHQL();
		//testCriteria();
		testSQLQuery();
	}
	//HQL方式查询。也可以修改删除啥的,只需要用executeUpdate()这个方法就行,返回被修改的行数
	private static void testHQL() {
		SessionFactory sf = new Configuration().configure().buildSessionFactory();
		Session s = sf.openSession();
		Query query = s.createQuery("from Product p where p.name like ?");
		query.setString(0, "%iphone%");
		List<Product> list = query.list();
		list.forEach(p ->{
			System.out.println(p);
		});
	}
	//使用Criteria进行数据查询。
	private static void testCriteria() {
		SessionFactory sf = new Configuration().configure().buildSessionFactory();
		Session s = sf.openSession();
		Criteria criteria = s.createCriteria(Product.class);
		criteria.add(Restrictions.like("name","%iphone%"));
		List<Product> list = criteria.list();
		list.forEach(p -> {
			System.out.println(p);
		});
		s.close();
		sf.close();
	}
	//标准sql语句查询
	private static void testSQLQuery() {
		SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        Query q= s.createSQLQuery("select * from product_ p where p.name like '%iphone%'");
        List<Object[]> list= q.list();
        for (Object[] os : list) {
            for (Object filed: os) {
                System.out.print(filed+"\t");
            }
            System.out.println();
        }
        s.close();
        sf.close();
	}
}

 
 

           


CAPTCHAis initialing...
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00