Hibernate查询之API查询

Hibernate在检索数据上,可以使用SQL、HQL和官方API进行查询,本人主要利用API进行相关查询的小demo。

话不多少直接上demo。

demo1:基本查询

    /**
     * 默认不加任何条件的时候是搜索全部。()
     * @param session
     */
    private static void demo1(Session session) {
        //criteria 是条件的意思
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        //idEq()是根据id进行匹配,gt()大于,lt()小于,in()在其中...
        criteria.add(Restrictions.idEq(4));
        List<StuInfo> infos = criteria.list();
        for (StuInfo stuInfo : infos) {
            System.out.println(stuInfo);
        }
    }

说明:

demo2:基本查询

    /**
     * 模糊查询
     * notice:普通的大于小于等的查询使用的是条件Restrictions
     * @param session
     */
    private static void demo2(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        criteria.add(Restrictions.like("stuName", "%刘%"));
        List<StuInfo> list = criteria.list();
        System.out.println(list.size());
    }

说明:

demo3:基本查询

/**
     * 关联查询
     * notice:利用createAlias来新建关联,翻译成SQL就是inner join,需要注意的是session中对应的那个类需要有一个字段叫做被关联的名称。
     * ps:实现原理是这样的:被关联的类的id作为外键ID,然后根据实体类的映射关系找到当前实体类的外键字段。
     * @param session
     */
    private static void demo4(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        // 词句代码是关键:表示引入stuClass这个类。notice:stuClass此字段必须存在在StuInfo这个类中。
        criteria.createAlias("stuClass", "cls");
        criteria.add(Restrictions.eq("cls.classId", 1)).add(Restrictions.gt("stu.stuId", 70));
        List<StuInfo> lists = criteria.list();
        for (StuInfo stuInfo : lists) {
            System.out.println(stuInfo);
        }
    }

说明:

demo4:基本查询

/**
     * 排序
     * Order.desc("propertyName")  或者  Order.asc("propertyName")
     * @param session
     */
    private static void demo5(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        criteria.add(Restrictions.gt("stu.stuId", 30));
        criteria.addOrder(Order.desc("stu.stuId"));
        List<StuInfo> list = criteria.list();
        for (StuInfo stuInfo : list) {
            System.out.println(stuInfo);
        }
    }

说明:

demo5:基本查询

/**
     * or
     * Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
     * @param session
     */
    private static void demo6(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
        List<StuInfo> list = criteria.list();
        for (StuInfo stuInfo : list) {
            System.out.println(stuInfo);
        }
    }

说明:

demo6:基本查询

/**
     * or
     * Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
     * @param session
     */
    private static void demo7(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        //notic:Restriction就是普通的条件直接add就可以了
        criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
        //notice:Projection在设置的使用需要使用setProjection
        criteria.setProjection(Projections.projectionList().add(Projections.avg("stuId")).add(Projections.rowCount()));

        List<StuInfo> list = criteria.list();
        for (StuInfo stuInfo : list) {
            System.out.println(stuInfo);
        }
    }

说明:

demo7:基本查询

/**
     * Projection作为同Restriction的一个条件,用在"聚合函数"和"投影"上
     * 两种办法:一种是利用as,一种是利用逗号分隔。
     *
     * @param session
     */
    private static void demo8(Session session) {
        Criteria criteria = session.createCriteria(StuInfo.class, "stu");
        //对于普通的条件Restriction相关的就是直接add,但是对于Projections若要链式添加,需要使用  Projections.projectionList().add().add()
        criteria.setProjection(Projections.projectionList().add(Projections.rowCount())
                .add(Projections.max("stu.stuId").as("max"))
                .add(Projections.alias(Projections.min("stu.stuId"), "min"))
                .add(Projections.groupProperty("stu.stuClass")));
        criteria.addOrder(Order.desc("min"));
        //需要注意的是使用投影后的返回值,本人觉得使用List<Object[]>最方便
        List<Object[]> list = criteria.list();
        for (Object[] object : list) {
            System.out.println(object);
        }
    }

说明:

demo8:基本查询

/**
     * 投影
     * notice:只需要部分数据的使用,使用 Project.property("xxx")
     * @param session
     */
    private static void demo10(Session session) {
        Criteria criteria=session.createCriteria(StuInfo.class,"stu");

        criteria.setProjection(Projections.projectionList().add(Projections.property("stuId").as("id"))
                .add(Projections.property("stuName"),"name")).addOrder(Order.desc("id")).addOrder(Order.asc("name"));
        List<Object[]> item=criteria.list();
        for (Object[] objects : item) {
            System.out.println("stuName:"+objects[1]+" stuId:"+objects[0]);
        }
    }

说明:

demo9:基本查询

/**
     * 分页
     *
     * @param session
     * @param pageSize 每页容量
     * @param pageNo  页码
     */
    private static void demo12(Session session,int pageSize,int pageNo) {
        Criteria criteria=session.createCriteria(StuInfo.class,"stu");
        criteria.setMaxResults(pageSize);
        int firstResult=(pageSize-1)*pageNo+1;
        criteria.setFirstResult(firstResult);
        List<StuInfo> stuInfos=criteria.list();
        for (StuInfo stuInfo : stuInfos) {
            System.out.println(stuInfo);
        }
    }

说明:

关于HQL部分可以参考此文:HQL查询

时间: 2024-10-06 00:08:29

Hibernate查询之API查询的相关文章

二、框架学习 (一)Hibernate框架学习 (2)Hibernate概念和api使用

目录 1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) 正文 实体类编写规则 1 实体类里面属性是私有的 2 私有属性使用公开的set和get方法操作. 3 要求实体类有属性作为唯一值(一般使用id值) 4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据类型对应的

Hibernate的核心API ---- 入门学习

叙:学习hibernate是必不可少的要了解其核心的API,下面电虫就核心API进行记录学习: Hibernate核心API Hibernate核心API有configuration.SessonFactory.Session.Transaction等,在Session中有增删改查等小地API,下面进行详细学习: 学习要有目标有方向,所以从一段代码中从上到下的进行研读不失为一种高效率的学习方法,学习模板代码如下所示: 1 package com.java.hibernate.demo1; 2 3

Hibernate 关于执行sql查询语句(转)

原文  http://www.yshjava.cn/post/543.html 主题 SQLHibernate Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的.通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类--SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询: session.creat

hibernate使用Query进行查询

本文主要探讨hibernate的简单查询,主要是使用Query进行的查询. 1.首先看下annotation的API中关于查询的描述 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 使用注解还可以映射EJBQL/HQL查询. @NamedQuery 和@NamedQueries是可使用在类和包上的注解. 但是它们的定义在session factory/entity manager factory范围中是都可见的. 命名式查询通过它的名字和实际的查询字符串来定义. javax.per

Hibernate 中Criteria Query查询详解【转】

当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象.在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Criteria实例中.这样,程序员可以不使用SQL甚至HQL的情况下进行

[Hibernate Search] (3) 基础查询

基础查询 眼下我们仅仅用到了基于keyword的查询,实际上Hibenrate Search DSL还提供了其他的查询方式,以下我们就来一探到底. 映射API和查询API 对于映射API.我们能够通过使用Hibernate提供的注解来完毕映射工作.同一时候我们也能够使用JPA提供的注解来完毕.类似的,对于查询API,我们也能够从Hibernate和JPA提供的查询API中进行选择. 每种方式都有它的长处和缺点,比方当我们使用Hibernate提供的查询API时,意味着能够使用很多其它的特性,毕竟

Hibernate关联操作、查询操作、高级特性、并发处理机制

本文所需的数据库初始文件,Hibernate常用操作的完整示例代码(包含所有Hibernate操作所需jar文件)提供下载学习:http://download.csdn.net/detail/daijin888888/9551724 1.Hibernate关联映射 1)什么是关联映射? 如果表之间具有关联关系,Hibernate允许我们在hbm.xml中描述他们的关联关系,然后在我们操作其中一张表时,自动的根据这种关系操作到另外的关系表,那么这种关联关系的设置,我们称之为关联映射. 2)关联映射

[Hibernate Search] (5) 高级查询 - 过滤,投影和分面

高级查询 在介绍了更多的高级映射功能之后,是时候回顾一下之前介绍过的查询功能了,看看如何借助这些高级的映射功能来使用一些高级的查询功能.本文会通过以下几个方面进行介绍: 如何在不和数据库进行任何交互的前提下,借助Lucene的力量来动态的筛选结果 如何通过使用基于投影(Projection)的查询来获取需要的属性,从而避免与数据库的交互 如何使用分面搜索(Faceted Search)对搜索结果进行划分 如何使用查询时提升(Boosting) 如何给查询设置时间限制 过滤(Filtering)

Spring Hibernate JPA 联表查询 复杂查询

(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用? Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可