HQL语句查询
- HQL完全是面向对象的,可以用来过程多态、继承、关联等关系。
- 大小写敏感 HQL中的使用的Java的类名和属性名是大小写敏感的,其他的关键字都是大小写不敏感的。所以“SeLeCT”等同与“sELEct”,也等同于“SELECT”,因为它不是Java类名,也不是Java类的属性名
查询前我们要先了解一个函数
createQuery() 以hibernate生成的Bean为对象装入list返回
createSQLQuery() 以对象数组进行存储
1.最简单的查询
@Test
public void fun(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String hql="from Customer";
//Customer类名
Query query = session.createQuery(hql);
List<Customer> list = query.list();
System.out.println(list);
tx.commit();
session.close();
}
基于 ? 的参数化形式
/**
* 查询中使用?,通过setParameter的方式可以防止sql注入
* jdbc的setParameter的下标从1开始,hql的下标从0开始
*/
List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like ?")
.setParameter(0, "%刘%")
.list();
注意:在jdbc中,setParameter的下标是从1开始的,而hibernate的setParameter的下标是从0开始的。
如果返回的值只有一个,可以使用uniqueResult方法
@Test
public void fun3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String hql2="select count(*) from Customer ";//计数
//Customer类名
Query query = session.createQuery(hql3);
Number number = (Number) query.uniqueResult();
System.out.println(number);
tx.commit();
session.close();
}
}
基于投影的查询
/**
* 如果对象中有导航对象,可以直接通过对象导航查询
*/
List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex")
.setParameter("room", "%计算机应用%").setParameter("sex", "%女%")
.list();
条件查询
/**
* 基于投影的查询,如果返回多个值,这些值都是保存在一个object[]数组当中
*/
List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.name, stu.sex from Student stu where name like
:name and sex like :sex")
.setParameter("name", "%张%").setParameter("sex", "%男%")
.list();
分页查询
public void fun(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String hql="from Customer";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(10);
tx.commit();
session.close();
}