Hibernate学习扩展知识

本文深入探讨了Hibernate框架中各种查询技巧与优化方法,包括HQL、Criteria API、Native SQL等不同查询方式的应用场景及注意事项,并重点介绍了如何通过调整抓取策略、利用缓存等方式提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 同样是先创建链接

Session session = HibernateSessionFactory.getSession();
  // List list=
  // session.createQuery("select employeeId,firstName,salary from Employees")
  // .list();

  // 如何进入持久层呢个呢?
  // List list=
  // session.createQuery("select new com.hsbc.hr.pojo.LittleEmp(e.employeeId,e.firstName,e.salary) from com.hsbc.hr.pojo.Employees e")
  // .list();
  // System.out.println(list);
  // findall from Employeee虽然可以得到所有的
  // 外表及其数据。但是这是立即检索的查询策略。他会将自己和关联到自己的所有从表和所有相关联的表和数据都立即加载到hibernate内存
  // 此时多态查询,只得到用户想要的对象,就能屏蔽其他对象加载内存
  // 内联接也是解决这个问题的。朱从表两方会进入内存。但是与之相关联其他从表。当用户不去使用其从表的列时,不加载。当用户时候的时候触发加载。

  // List list=
  // session.createQuery("select sum(e.salary),max(e.salary) from com.hsbc.hr.pojo.Employees e")
  // .list();
  // 让聚合函数进入持久层方法同上
  // 联结查询。然后问题。链接查询虽然解决了对象立即检索的问题。但是没有解决持久层的问题
  // 所以解决方案是迫切查询策略。他可以让查询结果进入持久层。并使用刚才的策略
  // 不用写
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e inner  join e.jobs")
  // .list();
  // 左外
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e left  join e.jobs")
  // .list();
  // 右外
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e right  join e.jobs")
  // .list();
  // 全外.不支持
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e full  join e.jobs")
  // .list();
  // 如何将链接查询进入持久层。使用迫切 。切记。hibernate老版本只支持迫切右
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e inner  join fetch e.jobs")
  // .list();
  // 迫切左外
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e left  join fetch e.jobs")
  // .list();
  // 迫切右外
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e right  join fetch e.jobs")
  // .list();
  // 全外.不支持
  // List list=
  // session.createQuery(" from com.hsbc.hr.pojo.Employees e full  join  fetch e.jobs")
  // .list();
  // 分组查询
  // List list = session
  // .createQuery(
  // "select e.jobs.jobId,count(e.employeeId) from com.hsbc.hr.pojo.Employees e  group  by e.jobs.jobId")
  // .setCacheable(true)
  // .list();
  // System.out.println(((Object[])list.get(1))[1]);
  // 如何进入持久层?方法同上
  // naturalId 是1==1永远为真
  // List list = session.createCriteria(Employees.class)
  // .add(Restrictions.naturalId())
  // .list();
  // != 或者<>
  // List list = session.createCriteria(Employees.class)
  // .add(Restrictions.ne("firstName", "Steven"))
  // .list();
  // 判断两个列不是值
  // List list = session.createCriteria(Employees.class)
  // .add(Restrictions.neProperty("firstName", "lastName"))
  // .list();
  // QBE
  Employees e = new Employees();
  e.setEmployeeId(101);// 不管id
  e.setFirstName("Neena");

  List list = session
    .createCriteria(Employees.class)
    .add(
      Example.create(e)
      .excludeNone()
      .excludeZeroes()
      .excludeProperty("firstName")).list();

  System.out.println(list);
 }

 public void qbc() {
  Session session = HibernateSessionFactory.getSession();
  // 内联接,仅供玩赏
  Criteria cri = session.createCriteria(Employees.class)
    .add(Restrictions.gt("employeeId", 100)).createCriteria("jobs")
    .add(Restrictions.idEq("IT_PROG"))
        .setCacheable(true);

  // 复杂的条件查询--and
  Junction con = Restrictions.conjunction()
    .add(Restrictions.gt("employeeId", 100))
    .add(Restrictions.gt("salary", 1.0));
  Criteria cri2 = session.createCriteria(Employees.class)
                       .add(con);


  Criteria cri3 = session.createCriteria(Employees.class).add(
    Restrictions.or(con, Restrictions.lt("employeeId", 1000)));

  // 复杂的条件查询--or
  Junction con2 = Restrictions.disjunction()
    .add(Restrictions.gt("employeeId", 100))
    .add(Restrictions.gt("salary", 1.0));
  Criteria cri4 = session.createCriteria(Employees.class).add(con2);

  // 统计分析
  ProjectionList pl = Projections.projectionList()
    .add(Projections.rowCount()).add(Projections.avg("salary"))
    .add(Projections.sum("salary")).add(Projections.max("salary"))
    .add(Projections.min("salary"));

  Criteria cri5 = session.createCriteria(Employees.class);
  cri5.setProjection(pl);
  // System.out.println(((Object[])cri5.list().get(0))[1]);
  // System.out.println(((Object[])cri5.uniqueResult())[2]);

  ProjectionList pl2 = Projections.projectionList()
    .add(Projections.rowCount())
    .add(Property.forName("jobs").group());
  Criteria cri6 = session.createCriteria(Employees.class);
  cri6.setProjection(pl2);

  // 离线查询查询.相当于预处理
  DetachedCriteria dc = DetachedCriteria.forClass(Employees.class)
    .add(Restrictions.idEq(101))
    .add(Restrictions.eq("firstName", "Neena")).setComment("测试");
  // 执行查询
  Criteria cri7 = dc.getExecutableCriteria(session);

  // 离线条件预处理1
  // Subqueries 和Property都可以
  DetachedCriteria dc2 = DetachedCriteria.forClass(Employees.class)
    .setProjection(Projections.avg("salary"));

  // 执行查询.结合离线查询
  Criteria cri8 = session.createCriteria(Employees.class).add(
    Property.forName("salary").lt(dc2));

  // 离线条件预处理2
  DetachedCriteria dc3 = DetachedCriteria.forClass(Employees.class)
    .setProjection(Projections.avg("salary"));

  // 执行查询.结合离线查询
  Criteria cri9 = session.createCriteria(Employees.class).add(
    Subqueries.lt(100.23, dc3));

  System.out.println(cri9.list());

  

 }

 public void testproc() {
  Session session = HibernateSessionFactory.getSession();
  Connection conn = session.connection();
  CallableStatement cs;
  try {
   cs = conn.prepareCall("{call proc1()}");
   System.out.println(cs);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 public void testxml() {
  Session session = HibernateSessionFactory.getSession();
  Query query = session.getNamedQuery("byname").setString("name",
    "Steven");
  System.out.println(query.list());
 }

 /**
  * 原生sql
  */
 public void nativesql() {
  Session session = HibernateSessionFactory.getSession();
  // 新版本的写法
  Query q = session.createSQLQuery("select * from employees");
  // 老版本的写法:
  Query q2 = session.createSQLQuery("select {a.*} from employees {a}");

  // q没有进入持久层。如何将一个纯粹的sql查询结果进入持久层
  Query q3 = session.createSQLQuery("select * from employees").addEntity(
    Employees.class);
  // 精度处理
  Integer ii = (Integer) session
    .createSQLQuery("select count(*) as cnt from employees")
    .addScalar("cnt", Hibernate.INTEGER).setCacheable(true)
    .uniqueResult();
  System.out.println(ii);
 }

 /**
 集合过滤
  * 第一步: <filter-def name="f1"> <filter-param name="filterparams"
  * type="string"/> </filter-def> 第二部:在<class>里面加入:<filter name="f1"
  * condition=":filterparams=first_name"></filter> 集合过滤 在xml定义filter
  */
 public void filter() {
  // 得到查询结果是Steven的数据
  Session session = HibernateSessionFactory.getSession();
  Filter f = session.enableFilter("f1").setParameter("filterparams",
    "Steven");
  List list = session.createCriteria(Employees.class).list();
  System.out.println(list);

 }
 
 /**
  * 优化
  */
 public void queruyouhua(){
  Session session = HibernateSessionFactory.getSession();
  // 内联接法2:左外链接而且迫切
  /*
   * 使用HQL的左联接抓取left join fetch 调用setFetchMode(FetchMode.JOIN)
   */
  Users1 u = (Users1) session.createCriteria(Users1.class)
      .setFetchMode("permissions", FetchMode.JOIN)
      .add(Restrictions.idEq(2)).uniqueResult();
  System.out.println("改变抓取策略" + u);
  
  //iter
   //session.createQuery("").iterate();
  session.close();
  session = HibernateSessionFactory.getSession();
   //管理缓存
  //调用query的list() iterator() save() saveOrUpdate() update()
  //         load() get()获得对象。对象就在内部缓存
  //当flush()调用,对象和数据库同步。如果不希望同步发生。正在处理大数据对象。可以调用evict()
  //从一级缓存去掉这些对象的集合。
  
   ScrollableResults sr= session.createCriteria(Users1.class)
                                .scroll();   
   while(sr.next()){
    System.out.println(sr.get(0));//0就是存放的对象
    session.evict(sr.get(0));
   }
  
  
  session.close();
  session = HibernateSessionFactory.getSession();
   //管理二级缓存
  //CacheMode.NORMAL 读写
  //CacheMode.GET    读,尽在update的时候写
  //CacheMode.PUT    写缓存。不从二级缓存读
  //CacheMode.REFRESH 写不读
  
  SessionFactory sf= HibernateSessionFactory.getSessionFactory();
  Map cacheObject= sf.getStatistics()
                 .getSecondLevelCacheStatistics(CacheMode.NORMAL.toString())
                 .getEntries()
                 ;
  //此时会爆出java.lang.NullPointerException
  //说明没有配置支持二级缓存的配置。
  //<property name="hibernate.generate_statistics">true</property>
  //<property name="hibernate.cache.use_structured_entries">true</property>
  
   System.out.println(cacheObject);                 
  
 }

 public static void main(String[] args) {
  new SeniroDAO().queruyouhua();
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值