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