美文网首页Android开发经验谈Java
【Java中级】11.0 SSH之Hibernate框架(八)—

【Java中级】11.0 SSH之Hibernate框架(八)—

作者: bobokaka | 来源:发表于2020-02-09 17:34 被阅读0次

本篇内容源代码:
Github —— HibernateQueryDemo
在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。

OID查询
对象导航检索
HQL检索(主要使用)
QBC检索(主要使用)
SQL检索

QBC检索参考如下文章:
【Java中级】8.0 SSH之Hibernate框架(四)——持久化类的编写规则、一级缓存、事务管理及其他API
【Java中级】8.5 SSH之Hibernate框架(五)——关于Criteria(QBC)过时的补充

以下代码测试,全部采用Hibernate一对多关系模式。

1.0 Hibernate的查询方式:OID查询

OID检索:Hibernate根据对象的OID(主键)进行检索

1.1 使用get方法
Customer customer = session.get(Customer.class,1l);
1.2 使用load方法
Customer customer = session.load(Customer.class,1l);
2.0 Hibernate的查询方式:对象导航检索

对象导航检索: Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer  = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();

通过一个已知对象获得一个关联对象。

3.0 Hibernate的查询方式:HQL检索(主要使用)

HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

3.1 初始化一些数据

创建新的数据库,在eclipse中搭建Hibernate项目环境。


image.png

代码放最后,或者在我的GitHub下载。
链接暂空。
先利用HibernateDemo1.java中新建方法初始化数据库数据。

package com.edp.hibernate.demo1;

/**
 * 
 * @Title: HibernateDemo1.java
 * @Package com.edp.hibernate.demo1
 * @author EdPeng
 * @version 创建时间 2020年2月7日下午9:01:14
 * @Description HQL查询方式的测试类
 * @version V1.0
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.edp.hibernate.domain.Customer;
import com.edp.hibernate.domain.LinkMan;
import com.edp.hibernate.utils.HibernateUtils;

public class HibernateDemo1 {

    @Test
    public void demo1() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 创建一个客户
        Customer customer = new Customer();
        customer.setCust_name("王三");

        for (int i = 0; i <= 10; i++) {
            LinkMan linkMan = new LinkMan();
            linkMan.setLkm_name("五菱之光" + i);
            linkMan.setCustomer(customer);

            customer.getLinkMans().add(linkMan);
            session.save(linkMan);
        }
        
        session.save(customer);

        transaction.commit();
    }
}

修改不同的名称,再运行两次,最后数据库初始化如下:


image.png
image.png
3.2 HQL的简单查询

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo2
     * @Description: HQL的简单查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        Query query = session.createQuery("from Customer");

        // sql中支持*号的写法:select * from cst_customer;但是在HQL中不支持*号的写法
       // Query query = session.createQuery("select * from Customer");该写法错误
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        transaction.commit();
    }
image.png
3.3 HQL的别名查询

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo3
     * @Description: HQL的别名查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo3() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

         // 取别名叫bieMing
//      Query query = session.createQuery("from Customer bieMing");
        Query query =session.createQuery("select bieMing from Customer bieMing");
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        transaction.commit();
    }
3.4 HQL的排序查询

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo4
     * @Description: HQL的排序查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo4() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

         // 排序的查询
        //默认情况,升序,或使用asc
//      List<Customer> list =   session.createQuery("from Customer order by cust_id").list();
        //设置降序排序
        List<Customer> list =   session.createQuery("from Customer order by cust_id desc").list();
                for (Customer customer : list) {
            System.out.println(customer);
        }
        transaction.commit();
    }
3.5 HQL的条件查询

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo5
     * @Description: HQL的排序查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 条件的查询
        // 1.按位置绑定
// Query query= session.createQuery("from Customer where cust_name = ?0");
// query.setParameter(0, "李二");
// List<Customer> list = query.list();

// Query query = session.createQuery("from Customer cust where cust.cust_source
// = ?0 and cust.cust_name like ?1");
// query.setParameter(0, "网络推广");
// query.setParameter(1, "李%");
// List<Customer> list = query.list();

        // 2.按名称绑定
        //带别名
//      Query query = session
//              .createQuery("from Customer cust where cust.cust_source = :aaa and cust.cust_name like :bbb");
//      query.setParameter("aaa", "网络推广");
//      query.setParameter("bbb", "李%");
//      List<Customer> list = query.list();
        //不带别名
        Query query = session
                .createQuery("from Customer where cust_source = :aaa and cust_name like :bbb");
        query.setParameter("aaa", "网络推广");
        query.setParameter("bbb", "李%");
        List<Customer> list = query.list();
        
        for (Customer customer : list) {
            System.out.println(customer);
        }
        transaction.commit();
    }
3.6 HQL的投影查询

投影查询:不是查询对象的所有属性,而是某个或者某些属性。

1. 单个查询

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo6
     * @Description: HQL的投影查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 投影查询
        // 单个属性
        List<Object> list = session.createQuery("select c.cust_name from Customer c").list();

        for (Object object : list) {
            System.out.println(object);
        }

        transaction.commit();
    }
image.png
2. 多个查询
    @Test
    /**
     * 
     * @Title: demo6
     * @Description: HQL的投影查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 投影查询
        List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }

        transaction.commit();
    }
3. 多个查询后封装到对象中

涉及到封装,需要在JavaBean类中重写方法。
Customer.java

public class Customer {
    
    public Customer() {
        super();
    }
    
    public Customer(String cust_name, String cust_source) {
        super();
        this.cust_name = cust_name;
        this.cust_source = cust_source;
    }

        …………

}

这里用eclipse的快捷生成方式:


image.png

HibernateDemo1.java

    @Test
    /**
     * 
     * @Title: demo6
     * @Description: HQL的投影查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 投影查询
        // 查询多个属性,但还是想封装到对象中
        List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();

        for (Customer customer : list) {
            System.out.println(customer);
        }
        transaction.commit();
    }
image.png
3.7 HQL的分页查询

从第12个开始,每10个一页查询。
在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo7
     * @Description: HQL的分页查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo7() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        Query query = session.createQuery("from LinkMan");
        query.setFirstResult(11);
        query.setMaxResults(10);
        List<LinkMan> list = query.list();
        
        for (LinkMan linkMan : list) {
            System.out.println(linkMan);
        }
        
        transaction.commit();
    }
image.png
3.8HQL的分组统计查询

查看如下两个SQL功能:

1. 统计存储数据的数目
image.png

在HibernateDemo1.java中新建方法:

    @Test
    /**
     * 
     * @Title: demo8
     * @Description: HQL的分组统计查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo8() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 统计表中总的记录数目,uniqueResult()返回唯一结果
        //聚合函数的使用:count(),max(),min(),avg(),sum()在HQL中都可以用
        Object object = session.createQuery("select count(*) from Customer").uniqueResult();
        System.out.println(object);
        
        transaction.commit();
    }
image.png
2. 通过客户来源从客户表中统计数据的个数。
image.png

在HibernateDemo1.java中修改demo8()方法:

    /**
     * 
     * @Title: demo8
     * @Description: HQL的分组统计查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo8() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 分组统计
        // 根据客户的来源统计客户的个数
        List<Object[]> list = session.createQuery("select cust_source ,count(*) from Customer group by cust_source")
                .list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        transaction.commit();
    }
image.png

修改一下数据库:


image.png

通过客户来源从客户表中统计来源人数大于2的数据的个数。

    @Test
    /**
     * 
     * @Title: demo8
     * @Description: HQL的分组统计查询
     * @param
     * @return void
     * @throws
     *
     */
    public void demo8() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 分组统计
        // 根据客户来源从客户表中统计来源人数大于2的数据的个数
        List<Object[]> list = session.createQuery("select cust_source ,count(*) from Customer group by cust_source having count(*) >= 2")
                .list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        transaction.commit();
    }
image.png

END

相关文章

网友评论

    本文标题:【Java中级】11.0 SSH之Hibernate框架(八)—

    本文链接:https://www.haomeiwen.com/subject/rxuvxhtx.html