Hibernate检索方式

1.概述

对数据操作中,最常用的是select。使用Hibernate如何进行select操作。

分为五种:
1.导航对象图检索方式,根据已加载的对象导航到其他对象。
2.OID检索方式,按照对象的OID来检索对象。
3.HQL检索方式,使用面向对象的HQL查询语言。
4.QBC检索方式,使用QBC API来检索对象,这种API封装了基于字符串形式的查询语言,提供了更加面向对象的查询接口。
5.本地SQL检索方式,使用本地数据库的SQL查询语句。

2.导航对象图检索方式

Customer C = session.get(Customer.class,2);
C.getOrders().size();
通过在Hibernate中进行映射关系,在Hibernate操作时,可以通过导航方式得到其关联的持久化对象信息。

3.OID检索方式

Session.get(Custuomer.class,2);
Session.load(Order.class,1);
Hibernate中通过get、load方法查询指定对象,要通过OID查询。

4.HQL

HQL是我们在Hibernate中常用的一种检索方式。
完整的HQL语句形式如下:Select/Update/Delete---from---where---group by---having---order by---asc/desc.
基本步骤:
1.得到session2.编写HQL语句
3.通过session。createQuery(hql)创建一个Query对象
4.为Query对象设置条件参数。
5.执行list查询所有,它所反射的是List集合,uniqueResult()返回一个查询结果。

4.基本检索

    @Test//基本检索
    public void test2(){
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      缩写HQL
        String hql = "from Customer";
        2.通过session.createQuery(hql)
//      org.hibernate.Query query = session.createQuery(hql);
        通过list方法得到数据
//      java.util.List<Customer> list = query.list();
        java.util.List<Customer> list = session.createQuery(hql).list();


        System.out.println(list.get(0));
    }

5.排序检索

    @Test//排序检索
    public void test3(){
//      查询订单,根据订单的价格进行排序
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      1.定义hql
        String hql = "from Orders order by money desc";
        java.util.List<Orders> list = session.createQuery(hql).list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

6.条件检索

    @Test//条件
    public void test4(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      1.根据位置来绑定参数
        String hql = "from Orders where money>:mymoney";
//      执行hql
        java.util.List<Orders> list = session.createQuery(hql).setParameter("mymoney", 40).list();
//      可以使用例如 SetString() SetDouble()这样的方法去田间参数,参数的序号从0开始


        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

7.分页检索

    @Test//分页
    public void test5(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

        org.hibernate.Query query = session.createQuery("from Orders");
        query.setFirstResult((2-1)*6);
        query.setMaxResults(6);

        java.util.List<Orders> list = query.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

8.分组统计

    @Test//分组统计
    public void test6(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      统计操作----统计一共有多少订单
        String sql = "select count(*) from Orders ";
        Object count = session.createQuery(sql).uniqueResult();
        System.out.println(count);

//      分组操作--每一个人的订单总价
        String hql = "select sum(money) from Orders group by c";
        java.util.List<Orders> list =  session.createQuery(hql).list();
        System.out.println(list);



        session.getTransaction().commit();
        session.close();
    }

9.投影查询

关于部分属性查询,可以使用投影将部分属性封装到对象中。

    @Test//投影查询
    public void test7(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();
//      1查询所有Customer的Name
//      String hql = "select name from Customer";
//      java.util.List<Orders> list = session.createQuery(hql).list();
//      System.out.println(list);

//      2查询所有的Customer的id,name
//      如果只查询一个列,得到的结果是List<Object>
//      String hql = "select id,name from Customer";
//      java.util.List<Object[]> list = session.createQuery(hql).list();
//      System.out.println(list);
//      for (Object[] objects:list) {
//          for (Object object : objects) {
//              System.out.println(object + "");
//          }
//          System.out.println();
//      }

//      3.使用投影将查询的结果封装懂啊Customer对象中
        String hql = "select new Customer(id,name) from Customer ";//必须在PO类中提供对应的构造方法。
        java.util.List<Customer> customers = session.createQuery(hql).list();
        System.out.println(customers);

        session.getTransaction().commit();
        session.close();
    }

10.命名查询

--可以将HQL语句先定义出来,在使用时通过session.getNamedQuery(QueryName),得到一个Query在执行。
--Q:hql定义在什么位置?
1.如果有hbm配置文件,那么在当前的hql操作是对哪一个实体进行操作,就在哪一个实体类中进行配置。
<query name="myHql">
    from Customer
</query>
2.如果是使用注解来描述PO的配置,直接在PO类中使用

@Entity
@Table(name="t_customer")
@NamedQuery(name="myHql",query="from Customer")

    @Test//命名查询
    public void test8(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

        org.hibernate.Query query = session.getNamedQuery("myHql");
        java.util.List<Customer> list = query.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

    @Test//命名查询2
    public void test9(){
//      
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//  1.要查询tommy这个客户的订单
        Customer c = session.get(Customer.class, 1);
        org.hibernate.Query query = session.getNamedQuery("findOrderByCustomer");
//      现在hql他的参数是一个实体
        java.util.List<Orders> list = query.setEntity("c", c).list();
        System.out.println(list);
        session.getTransaction().commit();
        session.close();
    }

11.QBC

--它是一种更加面向对象的检索方式
QBC步骤:
1.Session得到一个Criteria对象,session.createCriteria()
2.设定条件 Criterion实例,他的获取可以通过Restrictions类提供静态。
    Criteria的add方法用于添加查询条件。
3.调用list进行查询,Criteria.list

11.1QBC基本检索

    @Test//QBC基本检索
    public void test1(){
//      查询所有的Customer
        Session session = hibernateUtils.openSession();
        session.beginTransaction();
//      得到一个Criteria对象
        Criteria criteria = session.createCriteria(Customer.class);

//      2.调用list方法
        List<Customer> list = criteria.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

11.2QBC排序检索

    @Test//QBC排序检索
    public void test2(){
//      查询订单信息,根据订单的价格进行查询
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

        Criteria criteria = session.createCriteria(Orders.class);
//      制定排序
        criteria.addOrder(org.hibernate.criterion.Order.desc("money"));
        List<Orders> list = criteria.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

11.3QBC条件检索

    @Test//QBC排序检索
    public void test3(){
//      查询订单信息,根据订单的价格进行查询
        Session session = hibernateUtils.openSession();
        session.beginTransaction();
//      查询名称叫tommy的客户

        Criteria criteria = session.createCriteria(Customer.class);
        Criterion like = Restrictions.like("name", "Tommy_");
        criteria.add(like);
        Customer customer = (Customer) criteria.uniqueResult();
        System.out.println(customer);

//      查询订单价格在1050以上的,并且他的客户是tommy
        Criteria criteria2 = session.createCriteria(Orders.class);
        SimpleExpression lt = Restrictions.lt("money", 1050d);
        SimpleExpression eq = Restrictions.eq("c", customer);

        LogicalExpression and = Restrictions.and(lt,eq);
        List<Orders> list = criteria2.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

11.4QBC分页检索

    @Test//分页检索
    public void test5(){
//      查询订单信息,根据订单的价格进行查询
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

        Criteria criteria = session.createCriteria(Orders.class);
        criteria.setFirstResult((2-1)*6);
        criteria.setMaxResults(6);
        List<Orders> list = criteria.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

11.5QBC统计检索


    @Test//统计检索
    public void test6(){
//      查询订单信息,根据订单的价格进行查询
        Session session = hibernateUtils.openSession();
        session.beginTransaction();
//      1.统计订单总数
        Criteria criteria = session.createCriteria(Orders.class);
        Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();//统计总行数Count(id)
        System.out.println(obj);

//      2.订单的总价格---分组统计根据客户
        criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c")));
        List<Object[]> list = criteria.list();//在这个集合中保存的是Object[money的信息,客户的信息];
        for (Object[] object : list) {
            for (Object object2 : object) {
                System.out.println(object2);
            }
        }

        session.getTransaction().commit();
        session.close();
    }

11.6 QBC离线的条件检索

    @Test//离线检索
    public void test7(){

//      1.得到一个DetaChedCriteria
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
        detachedCriteria.add(Restrictions.like("name", "Tommy_"));

//      2.生成Criteria的执行操作
        Session session = hibernateUtils.openSession();
        session.beginTransaction();
        Criteria criteria = detachedCriteria.getExecutableCriteria(session);
        List<Customer> list = criteria.list();

        System.out.println(list);
        session.getTransaction().commit();
        session.close();

    }

11.7 QBC 本地SQL

    @Test//本地SQL
    public void test8(){
        Session session = hibernateUtils.openSession();
        session.beginTransaction();

//      1.执行本地sql
        SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");

        sqlQuery.addEntity(Customer.class);//将查询结果绑定到指定的对象。
        List list = sqlQuery.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }

11.8 QBC 本地SQL

--本地SQL也支持命名的查询
可以见sQl语句定义在hbm文件中,也可以使用注解。
<sql-query name=""></sql-query>

本地命名sql注解定义
@NamedNativeQuery(name="findCustomer",query="select * from t_customer")
如果在执行这个命令的sql会产生异常。


        Query query = session.getNamedQuery("findCustomer");
        List list2 = query.list();
        System.out.println(list);

出现问题的原因是:Hibernate不知道执行“select * from customer”后怎么对结果进行封装

在po类中,Customer
@sqlResultSetMapping(name="customerSetMapping",entitied = {@EntityResult(entityClass = Customer.class,fields = {@FieldResult(name="id",column="id"),@FieldResult(name="name",column="name")})})
@NamedNativeQuery(name="findCustomer",query="select * from t_customer",resultSetMapping="customerSetMapping")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值