引言
HQL:Hibernate query language
HQL查询:Hibernate独家查询语言。
使用范围:适合多表查询,但不复杂时使用。
一、普通查询
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
String hql = “from cn.it.domain.Customer”;
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 根据查询对象获得查询结果(结果不唯一,用list方法)
List<Customer> list = query.list(); //返回list结果。
System.out.println(list);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
二、条件查询
HQL语句中,不可能出现任何数据库相关的信息的。
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
String hql = “from Customer where cust_id = 1”(属性名)
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 根据查询对象获得查询结果
Customer c = (Customer)query.uniqueResult();
System.out.println(c);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
三、问号占位符
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
String hql = “from Customer where cust_id = ?”;
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 设置参数(HQL中第一位索引为0, SQL中第一位索引为1)
query.setLong(0, 1L);
4 根据查询对象获得查询结果
Customerc = (Customer)query.uniqueResult();
System.out.println(c);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
四、问号占位符(不管占位符数据类型)
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
问号占位符
String hql = “from Customer where cust_id = ?”;
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 设置参数
query.setParameter(0,1L);
4 根据查询对象获得查询结果
Customer c = (Customer)query.uniqueResult();
System.out.println(c);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
五、命名占位符(只要命名占位符不重名就可以,名字可以随意取,一般用字段名)
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
String hql = “from Customer where cust_id = :cust_id”;(占位符名可以随意取,一般用字段名)
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 设置参数(在setParameter()方法中通过变量名来设置参数值)
query.setParameter(“cust_id”, 1L);//占位符名
4 根据查询对象获得查询结果(一个结果用uniqueResult方法)
Customer c =(Customer)query.uniqueResult();
System.out.println(c);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
注意:不能在HQL中既使用“?”又使用“:”,
例如 String hql = “from Customer where cust_id =:cust_id and cust_sex = ?”;
六、分页查询
public class CustomerDaoImpl implements CustomerDao {
public void save(Customer c) {
//1.获得session
Session session = HibernateUtils.openSession();
//2.打开事务
Transaction tx = session.beginTransaction();
//*****************************************
//3. 执行操作
1 书写HQL语句 String hql = “from 对象的完整类名”;
String hql = “from cn.it.domain.Customer”;
2 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
3 设置分页信息
query.setFirstResult(0);//从哪个开始
query.setMaxResults(5);//每次几个
4 根据查询对象获得查询结果
List<Customer> list = query.list();
System.out.println(list);
//******************************************
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}