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入门4
原文地址:http://www.cnblogs.com/geore/p/7503554.html