1.HQL简介?
HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似,在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式。
- 在查询语句中设定各种查询条件;
- 支持投影查询, 即仅检索出对象的部分属性;
- 支持分页查询;
- 支持连接查询;
- 支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字;
- 提供内置聚集函数, 如 sum(), min() 和 max();
- 支持子查询;
- 支持动态绑定参数;
- 能够调用 用户定义的 SQL 函数或标准的 SQL 函数。
2.HQL与SQL区别
HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句。HQL 查询语句中的主体是域模型中的类及类的属性。
SQL 查询语句是与关系数据库绑定在一起的。SQL 查询语句中的主体是数据库表及表的字段。
3.HQL使用
3.1实体查询
最简单实体查询例子
/**
* 返回对象(多个)
*/
public void testList1() {
Query query = session.createQuery("from Book");
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
?3.2属性查询
有时,我们需要的数据可能仅仅是实体对象的某个属性(库表记录中的某个字段信息)。通过HQL可以简单的做到这一点。
/**
* 返回单个列段,用字符串就可以接受
*/
public void testList2() {
Query query = session.createQuery("select b.bookName as ss from Book b");
List<String> list = query.list();
for (String b : list) {
System.out.println(b);
}
}
上例中,我们指定只需要获取Book的name属性。返回的list数据结构中,每个条目都是一个String类型的name数据。 我们也可以通过一条HQL获取多个属性
/**
* 查两个列段及以上,默认返回的是Object【】
*/
public void testList3() {
Query query = session.createQuery("select b.bookId,b.bookName as ss from Book b");
List<Object[]> list = query.list();
for (Object[] b : list) {
System.out.println(Arrays.toString(b));
}
}
3.3map集合
将需要获取的属性放入map函数中即可。
/**
* 注意map是函数,所以不区分大小写,返回的是map集合
*/
public void testList4() {
Query query = session.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
List<Map> list = query.list();
for (Map b : list) {
System.out.println(b);
}
}
3.4对象封装
可以通过在HQL中动态的构造函数方法对这些数据进行封装。
/**
* 查两个列段及以上,也可返回对象,前提是有对应的构造函数
*/
public void testList5() {
Query query = session.createQuery("select new Book(b.bookId,b.bookName) from Book b");
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
3.5HQL占位符
简单占位符使用
Query query = session.createQuery("from Book where bookId = :bookId");
query.setParameter("bookId", 1);
Book b = (Book) query.getSingleResult();
System.out.println(b);
多个占位符
Query query = session.createQuery("from Book where bookId in (:bookIds)");
query.setParameterList("bookIds", new Integer[] {1,2,4});
3.6连表查询?
/**
* HQL支持连接查询
*/
public void testList7() {
Query query = session.createQuery("select o.orderNo,oi.quantity from Order o,OrderItem oi where oio.orderId = oi.order.orderId");
List<Object[]> list = query.list();
for (Object[] b : list) {
System.out.println(Arrays.toString(b));
}
}
3.8HQL聚合函数与分页
/**
* HQL支持聚合函数
*/
public void testList8() {
Query query = session.createQuery("select count(*) from Book");
Long singleResult = (Long) query.getSingleResult();
System.out.println(singleResult);
}
/**
* HQL分页
*/
public void testList9() {
Query query = session.createQuery("from Book");
//起始下标
query.setFirstResult(2);
//每页最大条数
query.setMaxResults(3);
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
?4.基于hibernate通用分页查询
/**
* 通用查询
* @param path 配置文件
* @param hql 执行语句
* @param p 分页工具
*/
public void executeQuery(String path,String hql,PageBean p) {
//1.对框架核心配置文件进行建模
Configuration configure = new Configuration().configure(path);
//2.获取sessionFactory工厂
SessionFactory buildSessionFactory = configure.buildSessionFactory();
//3.获取session会话
Session session = buildSessionFactory.openSession();
//计算数据总条数hql
Query createQuery = session.createQuery(getcount(hql));
//将总条数赋值给PageBean的total
p.setTotal(createQuery.getSingleResult().toString());
//执行hql
Query createQuery2 = session.createQuery(hql);
//设置起始下标
createQuery2.setFirstResult(p.getStartIndex());
//设置最大每页条数
createQuery2.setMaxResults(p.getRows());
List list = createQuery2.list();
for (Object object : list) {
System.out.println(object);
}
session.close();
}
private String getcount(String hql) {
//考虑用户传过来的hql语句可能大小写不同
String upperCase = hql.toUpperCase();
// System.out.println(upperCase);
return "select count(*) "+hql.substring(upperCase.indexOf("FROM"));
}
调用
PageBean p = new PageBean();
//设置每页条数
p.setRows(2);
new BaseDemo().executeQuery("/hibernate.cfg.xml", " from User where userName like '%z%' ", p);
5.hibernate操作原生SQL?
//1.对框架核心配置文件进行建模
Configuration configure = new Configuration().configure("/hibernate.cfg.xml");
//2.获取sessionFactory工厂
SessionFactory buildSessionFactory = configure.buildSessionFactory();
//3.获取session会话
Session openSession = buildSessionFactory.openSession();
// //4.session 操作对象
/* 原生SQL */
List list = openSession.createSQLQuery("select * from t_hibernate_user where user_name like '%z%' ").addEntity(User.class).list();
/* HQL */
// List list = openSession.createQuery(" select COUNT(1) from User where userName like '%z%' ").list();
for (Object object : list) {
System.out.println(object);
}
// //7.关闭session
openSession.close();
|