HQL(Hibernate Query Language)
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL语言有些相似。在hibernate提供的各种检索方式中,HQL是使用最广泛的一种检索方式。它有如下功能:
1、 在查询语句中设定各种查询条件
2、 支持投影查询, 即仅检索出对象的部分属性
方式一:
@Test
public void find(){
//投影查询
Sessionsession=HibernateUtil.getSession();
Iterator<Object[]>it= session.createQuery("selectc.petName,c.realName from Customers as c").iterate();
while(it.hasNext()){
Object[]c=it.next();
System.out.println("petName===="+c[0]+"realName==="+c[1]);
}
}
方式二:
@Test
public void find1(){
//投影查询
Sessionsession=HibernateUtil.getSession();
List<Object[]> list= session.createQuery("select c.petName,c.realName from Customers asc").list();
for(Object[] c:list){
System.out.println("petName===="+c[0]+"realName==="+c[1]);
}
}
Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1):返回的类型不一样,list()返回List,iterate()返回Iterator,
2): 获取数据的方式不一样,list()会直接查数据库,iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。
3):iterate会查询2级缓存, list只会查询一级缓存。
4): list()中返回的List中每个对象都是原本的对象,iterate()中返回的对象是代理对象.
list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
结果集的处理方法不同:
list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果
集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来
初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
3、 支持分页查询
4、 支持连接查询[自然连接,左连接,右连接,内连接(不知道mysql是否支持内连接)]
5、 支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
6、 提供内置聚集函数, 如 sum(),min() 和max()
7、 能够调用 用户定义的 SQL 函数或标准的 SQL 函数
8、 支持子查询[一个条件查询的结果作为另一个条件查询的条件]
9、 支持动态绑定参数[可以为占位符赋值]
OID检索方式
按照对象的OID来检索对象
QBC检索方式
使用 QBC(Query ByCriteria) API 来检索对象. 这种API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
简单的查询:
使用HQL查询
Query query=session.createQuery("from Customers");
List<Customers>customers=query.list();
//方法链编程
Customers customer=(Customers) session.createQuery("from Customers as c where c.petName=?").setString(0, "bbb").list().get(0);
使用别名:
通过HQL检索一个类的实例时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名
from Customers as c where c.name=:customer
注:as可省略
绑定参数的形式,按参数名绑定:
@Test
public void findAll2(){
//检索出所有的用户
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from Customers as c where c.petName=:name");//sql 面向对象的sql 语句
query.setString("name", "bbb");//第一个参数是占位符的名称,第二个参数:参数的值
//遍历出所有的查询结果
Iterator<Customers> it=query.iterate();
while(it.hasNext()){
Customers customer=it.next();
System.out.println(customer.toString());
}
}
注:以上的方法仅为hibernate中检索方式的一部分