HIbernate的导航查询:
适用场景:当一张A表关联到另一张B表的多条记录,存在一对多的关系(或者多对多),那么查询A表的记录时,就可以将A表某条记录关联的B表的所有记录查询出来,这种方式,就叫做Hibernate的导航查询(如:一张客户表,一张联系人表,客户表存在一条记录是百度公司的,而在联系人表中对应着多条联系人的记录,而在定义实体类的时候,客户实体类中就进行绑定联系人类用了一个Set进行绑定,因此在查询某个客户的时候,对应的此客户下的联系人Set集合中的数据也就一并查找出来了,这种查询的方式,就叫做导航查询)。
代码片段:
1 // Hibernate的对象导航查询 2 @Test 3 public void fun1() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 // 通过id找到对应的数据记录 12 Customer customer = session.get(Customer.class, "4028db335e71d646015e71d64c8e0000"); 13 Set<LinkMan> sets = customer.getMans(); 14 System.out.println(customer.getCustName()+"的联系人人数为: "+sets.size()); 15 System.out.println("联系人具体的详情:"); 16 for(LinkMan man : sets) { 17 System.out.println(man); 18 } 19 ts.commit(); 20 } catch (Exception e) { 21 ts.rollback(); 22 e.printStackTrace(); 23 } finally { 24 session.close(); 25 } 26 }
运行截图:
OID查询:
oid查询,就是根据id查询记录,调用的是Session的get()方法,这种方式比较简单,代码见下:
1 // 通过id找到对应的数据记录 2 Customer customer = session.get(Customer.class, "4028db335e71d646015e71d64c8e0000");
HIbernate的HQL查询方式:
HQL:HIbernate Query Language,由HIbernate提供的一种查询语言,HQL语言和普通sql很相似,两者的区别在于:sql操作的是数据库表和表的字段,hql操作的是实体类和实体类的属性。
使用HQL进行查询操作的步骤(使用Query对象进行操作):
1. 创建Query对象,写hql语句
2. 调用query对象里面的方法得到结果
HQL查询所有代码片段:
1 /** 2 * 查询:HQL查询 3 * 4 * @author Geore 5 * 6 */ 7 public class TestDemo6 { 8 @Test 9 // 查询所有 10 public void fun1() { 11 Transaction ts = null; 12 Session session = null; 13 SessionFactory factory = null; 14 try { 15 factory = Tools.getSessionFactory(); 16 session = factory.openSession(); 17 ts = session.beginTransaction(); 18 19 // 得到Query对象,通过session的createQuery方法(写hql语句) 20 Query query = session.createQuery("from Customer"); 21 // 得到查询的结果 22 List<Customer> list = query.list(); 23 for (Customer cust : list) { 24 System.out.println(cust.getCustName() + "--" 25 + cust.getCustSource() + "--联系人数:" 26 + cust.getMans().size()); 27 } 28 29 ts.commit(); 30 } catch (Exception e) { 31 ts.rollback(); 32 e.printStackTrace(); 33 } finally { 34 session.close(); 35 } 36 } 37 }
HQL查询所有的hql语句: from pojo类;
运行截图:
HQL的条件查询操作:
1 @Test 2 // hql条件查询 3 public void fun2() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("from Customer where custLevel=?"); 14 // 设置占位符的值 15 query.setParameter(0, "svip"); 16 // 查询,并得到结果集 17 List<Customer> list = query.list(); 18 // 便利输出结果集合 19 for (Customer cust : list) { 20 System.out.println(cust.getCustName() + "--" 21 + cust.getCustSource() + "--联系人数:" 22 + cust.getMans().size()); 23 } 24 ts.commit(); 25 } catch (Exception e) { 26 ts.rollback(); 27 e.printStackTrace(); 28 } finally { 29 session.close(); 30 } 31 } 32 -正常条件查询
1 @Test 2 // hql的模糊查询 3 public void fun3() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("from Customer where custLevel like ?"); 14 // 设置占位符的值 15 query.setParameter(0, "%sv%"); 16 // 查询,并得到结果集 17 List<Customer> list = query.list(); 18 // 便利输出结果集合 19 for (Customer cust : list) { 20 System.out.println(cust.getCustName() + "--" 21 + cust.getCustSource() + "--联系人数:" 22 + cust.getMans().size()); 23 } 24 ts.commit(); 25 } catch (Exception e) { 26 ts.rollback(); 27 e.printStackTrace(); 28 } finally { 29 session.close(); 30 } 31 }
HQL的条件查询的hql语句:
1 条件查询: 2 FROM 实体类名称 WHERE 实体类属性名称1=? and 实体类属性名称n=? 3 4 模糊查询: 5 FROM 实体类名称 WHERE 实体类属性名称 LIKE ?
运行截图:
HQL的排序查询:
排序代码片段:
1 @Test 2 // hql的排序查询 3 public void fun4() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("from LinkMan order by linkName desc"); 14 // 查询,并得到结果集 15 List<LinkMan> list = query.list(); 16 // 便利输出结果集合 17 for (LinkMan man : list) { 18 System.out.println(man.getLinkName() + " -- " + man.getLid()); 19 } 20 ts.commit(); 21 } catch (Exception e) { 22 ts.rollback(); 23 e.printStackTrace(); 24 } finally { 25 session.close(); 26 } 27 }
HQL的排序语句写法:
1 FROM 实体类名称 ORDER BY 实体类属性名称 ASC/DESC
运行截图(按照字母倒序在排):
HQL的分页查询:
在hql操作中,在语句里面不能写limit,hibernate的Query对象中封装了两个方法实现分页操作。
分页查询代码片段:
1 @Test 2 // 分页查询 3 public void fun5() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("from LinkMan"); 14 // 设置分页查询的起始位置 15 query.setFirstResult(0); 16 query.setMaxResults(2); 17 // 得到查询的结果 18 List<LinkMan> list = query.list(); 19 for (LinkMan man : list) { 20 System.out.println(man.getLid() + " -- " + man.getLinkName()); 21 } 22 23 ts.commit(); 24 } catch (Exception e) { 25 ts.rollback(); 26 e.printStackTrace(); 27 } finally { 28 session.close(); 29 } 30 }
运行截图:
HQL投影查询:
查询的不是表的所有字段,而是部分字段的值
代码片段:
1 @Test 2 // 投影查询 3 public void fun6() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("select linkName from LinkMan"); 14 // 得到查询的结果 15 List<Object> list = query.list(); 16 for (Object man : list) { 17 System.out.println(man); 18 } 19 20 ts.commit(); 21 } catch (Exception e) { 22 ts.rollback(); 23 e.printStackTrace(); 24 } finally { 25 session.close(); 26 } 27 }
投影查询的hql语句
1 SELECT 实体类属性名1,实体类属性名2...实体类属性名n FROM 实体类名称(select后不能写*号)
运行截图:
HQL的聚集函数的使用:
在数据库的操作中存在很多的聚合函数,如count,max,min等。同时在hql也提供了聚合函数的支持,和sql的一样。
count聚集函数代码片段:
1 @Test 2 // 聚集函数的使用 3 public void fun7() { 4 Transaction ts = null; 5 Session session = null; 6 SessionFactory factory = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 ts = session.beginTransaction(); 11 12 // 得到Query对象,通过session的createQuery方法(写hql语句) 13 Query query = session.createQuery("select count(*) from LinkMan"); 14 // 得到查询的结果 15 Object obj = query.uniqueResult(); 16 System.out.println("t_linkman表有: " + obj + " 条记录。"); 17 18 ts.commit(); 19 } catch (Exception e) { 20 ts.rollback(); 21 e.printStackTrace(); 22 } finally { 23 session.close(); 24 } 25 }
运行截图:
Hibernate的QBC查询:
使用QBC查询的话,不需要使用HQL语句了,而是通过方法进行实现,QBC查询操作的是实体类和属性,要使用QBC进行查询,那么就必须了解到Criteria类的使用。
QBC查询所有:
代码片段:
1 // 查询所有 2 @Test 3 public void fun1() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 得到Criteria 13 Criteria criteria = session.createCriteria(Customer.class); 14 // 进行查询,得到Customer的集合结果集 15 List<Customer> list = criteria.list(); 16 // 遍历输出 17 for(Customer customer : list) { 18 System.out.println(customer.getCid() + " -- " + customer.getCustName()); 19 } 20 tx.commit(); 21 } catch(Exception e){ 22 tx.rollback(); 23 e.printStackTrace(); 24 } finally { 25 session.close(); 26 } 27 }
运行截图:
QBC的条件查询:
QBC的条件查询需要进行条件的绑定,而进行条件绑定则需要使用到Criteria类的add()方法,并且在add方法中进行条件绑定,而add方法中则需要传人一个参数,我们只需要在add中使用Restrictions类的静态方法来进行条件绑定即可,Restrictions类的主要的方法,如下:
代码片段:
1 @Test 2 // QBC条件查询,条件查询要使用到一个类:Restrictions,这个类用来绑定条件 3 public void fun2() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 得到Criteria 13 Criteria criteria = session.createCriteria(Customer.class); 14 // 进行条件查询,设置条件值 15 criteria.add(Restrictions.eq("custName", "Geore")); 16 // 进行查询得到结果集 17 List<Customer> list = criteria.list(); 18 // 遍历输出 19 for(Customer customer : list) { 20 System.out.println(customer.getCid() + " -- " + customer.getCustName()); 21 } 22 tx.commit(); 23 } catch(Exception e){ 24 tx.rollback(); 25 e.printStackTrace(); 26 } finally { 27 session.close(); 28 } 29 }
运行截图:
QBC的排序查询:
QBC的排序查询:使用Criteria类的addOrder()方法,在addOrder()中需要传入参数Order对象,而Order类有两个方法asc()和desc(),分别对应的就是升序和降序的方法。
代码片段:
1 @Test 2 // QBC排序查询 3 public void fun3() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 得到Criteria 13 Criteria criteria = session.createCriteria(Customer.class); 14 // 进行排序查询 15 criteria.addOrder(Order.asc("cid")); // 升序 16 // criteria.addOrder(Order.desc("")); 降序 17 // 进行查询得到结果集 18 List<Customer> list = criteria.list(); 19 // 遍历输出 20 for(Customer customer : list) { 21 System.out.println(customer.getCid() + " -- " + customer.getCustName()); 22 } 23 tx.commit(); 24 } catch(Exception e){ 25 tx.rollback(); 26 e.printStackTrace(); 27 } finally { 28 session.close(); 29 } 30 }
运行截图:
QBC的分页查询:
使用两个方法:setFirstResult(0) 设置起始位置 和 setMaxResults(2) 设置每页最大数
代码片段:
1 @Test 2 // QBC分页查询 3 public void fun4() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 得到Criteria 13 Criteria criteria = session.createCriteria(Customer.class); 14 // 进行分页查询 15 criteria.setFirstResult(0); // 设置起始位置 16 criteria.setMaxResults(2); // 设置每页最大数 17 18 // 进行查询得到结果集 19 List<Customer> list = criteria.list(); 20 // 遍历输出 21 for(Customer customer : list) { 22 System.out.println(customer.getCid() + " -- " + customer.getCustName()); 23 } 24 tx.commit(); 25 } catch(Exception e){ 26 tx.rollback(); 27 e.printStackTrace(); 28 } finally { 29 session.close(); 30 } 31 }
运行截图:
QBC的聚合函数:
对于QBC的聚合函数的查询,使用Criteria类的setProjection()方法,在setProjection()方法中使用Projections类调用这个类的方法即可实现聚合函数的查询,Projections的方法如下:
代码片段:
1 @Test 2 // QBC聚合函数 3 public void fun5() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 得到Criteria 13 Criteria criteria = session.createCriteria(Customer.class); 14 // 进行统计查询 15 criteria.setProjection(Projections.rowCount()); 16 Object obj = criteria.uniqueResult(); 17 System.out.println(obj); 18 19 tx.commit(); 20 } catch(Exception e){ 21 tx.rollback(); 22 e.printStackTrace(); 23 } finally { 24 session.close(); 25 } 26 }
运行截图:
QBC的离线查询:
QBC离线查询使用的是DetachedCriteria类,并使用此类的forClass()静态方法创建这个类的对象,并在最终执行查询的时候,使用Session,得到Criteria。
代码片段:
1 @Test 2 // QBC离线查询 3 public void fun6() { 4 SessionFactory factory = null; 5 Session session = null; 6 Transaction tx = null; 7 try { 8 factory = Tools.getSessionFactory(); 9 session = factory.openSession(); 10 tx = session.beginTransaction(); 11 12 // 离线查询使用的是DetachedCriteria类,并使用此类的forClass()静态方法创建这个类的对象 13 DetachedCriteria dCriteria = DetachedCriteria.forClass(Customer.class); 14 // 在最终执行查询的时候,使用Session,得到Criteria 15 Criteria criteria = dCriteria.getExecutableCriteria(session); 16 // 得到查询的结果集 17 List<Customer> list = criteria.list(); 18 // 便利输出 19 for(Customer customer : list) { 20 System.out.println(customer.getCid() + " -- " + customer.getCustName()); 21 } 22 tx.commit(); 23 } catch(Exception e){ 24 tx.rollback(); 25 e.printStackTrace(); 26 } finally { 27 session.close(); 28 } 29 }
运行截图: