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(); } }