java之hibernate之hibernate查询

这篇主要简单间接 hibernate查询

1.数据库操作中最重要的是查询,Hibernate提供了多种查询方式来帮助程序员快速实现查询功能。

有hql,本地sql查询,Criteria查询,example, oid等。

2.Hql 查询:
Hql :hibernate query language,Hiberante查询语言。这是一种面向对象的查询语言,和 sql 语句非常相似,对于查询关键字不区分大小写,其他的都区分大小写。

3.测试

public class HibernateTest {
    Session session =null;
    //在每次执行测试方法前,先执行一次
    @Before
    public void before(){
        session = HibernateUtil.getSession();
    }
    //每次执行测试方法后,执行一次
    @After
    public void after(){
        HibernateUtil.close();
    }
    //查询所有
    @Test
    public void testFindAll(){
        //编写hql语句  Book是类名  区分大小写,相当于select * from t_book;
        String hql="from Book";
        List<Book> list = session.createQuery(hql).list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //条件查询
    @Test
    public void testCondition(){
        //可以在类名 后设置别名,如果设置了别名就得使用
        String hql="from Book b where b.price>40";
        List<Book> list = session.createQuery(hql).list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //传参
    @Test
    public void testParam(){
        //可以在类名 后设置别名,如果设置了别名就得使用
        String hql="from Book b where b.price>?";
        List<Book> list = session.createQuery(hql)
                    .setDouble(0, 40)//为占位符设置参数
                    .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //参数通过命名查询
    @Test
    public void testNameParam(){
        //命名前 加冒号
        String hql="from Book b where b.price>:price";
        List<Book> list = session.createQuery(hql)
                    .setDouble("price", 40)//为占位符设置参数
                    .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //模糊查询
    @Test
    public void testLike(){
        String hql="from Book b where b.name like :name";
        List<Book> list = session.createQuery(hql)
                    .setString("name", "水%")//为占位符设置参数
                    .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //查询指定列的数据
    @Test
    public void testColumn(){
        String hql="select b.name,b.author from Book b";
        List<Object[]> list = session.createQuery(hql).list();
        for(Object[] temp:list){
            System.out.println(temp[0]+"---"+temp[1]);
        }
    }
    //将查询指定列的数据封装为对象
    @Test
    public void testColumnObject(){
        String hql="select new Book(b.name,b.author) from Book b";
        List<Book> list = session.createQuery(hql).list();
        for(Book b:list){
            System.out.println(b.getName()+"---"+b.getAuthor());
        }
    }
    //聚合函数查询
    @Test
    public void testCount(){
        String hql="select count(id) from Book";
        List list=session.createQuery(hql).list();
        System.out.println(list.get(0));
    }
    //返回唯一值  uniqueResult返回值  只有一个值
    @Test
    public void testCount1(){
        String hql="select count(id) from Book";
        long result=(Long)session.createQuery(hql).uniqueResult();
        System.out.println(result);
    }
    //查询单个对象也可以使用uniqueResult
    @Test
    public void testUniqueObject(){
        String hql="from Book b where b.id=1";
        Book b = (Book)session.createQuery(hql).uniqueResult();
        System.out.println(b.getName()+"---"+b.getAuthor());
    }
    //分页查询
    @Test
    public void testPage(){
        //当前页       currentPage
        //每页显示记录数 pageSize
        List<Book> list = session.createQuery("from Book")
                            //(currentPage-1)*pageSize
                            .setFirstResult(3)
                            //pageSize
                            .setMaxResults(3)
                            .list();
        for(Book b:list){
            System.out.println(b.getName()+"---"+b.getAuthor());
        }
    }
    //in子查询
    @Test
    public void testIn(){
        String hql="from Book b where b.id in(:ids)";
        List<Book> list = session.createQuery(hql)
                            .setParameterList("ids", new Integer[]{1,2,4})
                            .list();
        for(Book b:list){
            System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor());
        }
    }
    //排序
    @Test
    public void testOrder(){
        String hql="from Book b where b.id in(:ids) order by b.id desc";
        List<Book> list = session.createQuery(hql)
                            .setParameterList("ids", new Integer[]{1,2,4})
                            .list();
        for(Book b:list){
            System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor());
        }
    }
    //分组查询  按书籍分类查询每个组的书的数量
    //查询列  必须是分组列或聚合列
    @Test
    public void testGroup(){
        String hql="select count(*),b.category.name from Book b group by b.category.name";
        List<Object[]> list = session.createQuery(hql).list();
        for(Object[] temp:list){
            System.out.println(temp[0]+"----"+temp[1]);
        }
    }
    //连接查询
    @Test
    public void testInner(){
        //String hql="select b.name,b.category.name,b.author from Book b";
        String hql="select b.name,b.category.name,b.author from Book b inner join b.category";
        List<Object[]> list = session.createQuery(hql).list();
        for(Object[] temp:list){
            System.out.println(temp[0]+"----"+temp[1]+"----"+temp[2]);
        }
    }
    //命名查询
    /**
     *在映射文件中配置好 如下命名查询
     <!-- hql命名查询 名称在整个项目唯一 -->
        <query name="findAll">
        from Book;
        </query>
     */
    @Test
    public void testNamedQuery(){
        List<Book> list = session.getNamedQuery("findAll").list();
        for(Book b:list){
            System.out.println(b.getName()+"--"+b.getAuthor());
        }
    }
}

4.本地 sql 查询: hibernate支持使用 sql 来查询;因为 hql 语句不能针对特定数据库功能来实现。

public class SqlTest {
    Session session =null;
    //在每次执行测试方法前,先执行一次
    @Before
    public void before(){
        session = HibernateUtil.getSession();
    }
    //每次执行测试方法后,执行一次
    @After
    public void after(){
        HibernateUtil.close();
    }
    //查询所有
    @Test
    public void testFindAll(){
        String sql="select * from t_book";
        List<Object[]> list =session.createSQLQuery(sql).list();
        for(Object[] temp:list){
            System.out.println(temp[0]+"---"+temp[1]+"---"+temp[2]);
        }
    }
    //将查询的数据进行封装为对象
    @Test
    public void testObject(){
        String sql="select * from t_book";
        List<Book> list = session.createSQLQuery(sql).addEntity(Book.class).list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //本地命名查询
    @Test
    public void testNamedQuery(){
        Object[] temp= (Object[])session.getNamedQuery("findBookById").uniqueResult();
        System.out.println(temp[0]+"---"+temp[1]);
    }
    //设置参数
    @Test
    public void testParam(){
        String sql="select * from t_book where price>?";
        List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
                            .setDouble(0, 40)
                            .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //设置参数名称
    @Test
    public void testParamName(){
        String sql="select * from t_book where price>:price";
        List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
                            .setDouble("price", 40)
                            .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
    //分页
    @Test
    public void testPage(){
        String sql="select * from t_book";
        List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
                            .setFirstResult(0)
                            .setMaxResults(2)
                            .list();
        for(Book b:list){
            System.out.println(b.getName()+"----"+b.getAuthor());
        }
    }
}

5. Criteria 查询:使用对象的方式进行查询

public class CriteriaTest {
    Session session =null;
    //在每次执行测试方法前,先执行一次
    @Before
    public void before(){
        session = HibernateUtil.getSession();
    }
    //每次执行测试方法后,执行一次
    @After
    public void after(){
        HibernateUtil.close();
    }
    //查询所有
    @Test
    public void testFindAll(){
        List<Book> list =session.createCriteria(Book.class).list();
        printListbook(list);
    }
    private void printListbook(List<Book> list) {
        for(Book b:list){
            System.out.println(b.getName()+"---"+b.getAuthor());
        }
    }
    //条件查询  使用Restrictions类的静态方法 添加各种条件
    @Test
    public void testCondition(){
        List<Book> list =session.createCriteria(Book.class)
                                //通过add添加条件
                                .add(Restrictions.ge("price", 40d))
                                .list();
        printListbook(list);
    }
    //多个条件and查询   价格大于20 并且 作者是sun
    @Test
    public void testMultiConditionAnd(){
        List<Book> list =session.createCriteria(Book.class)
                //通过add添加条件
                .add(Restrictions.ge("price", 20d))
                .add(Restrictions.eq("author", "sun"))
                .list();
        printListbook(list);
    }
    @Test
    public void testMultiConditionAnd1(){
        List<Book> list =session.createCriteria(Book.class)
                //通过add添加条件
                .add(Restrictions.and(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun")))

                .list();
        printListbook(list);
    }
    //多条件or查询  价格大于20 或者 作者是sun
    @Test
    public void testMultiConditionOr(){
        List<Book> list =session.createCriteria(Book.class)
                //通过add添加条件
                .add(Restrictions.or(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun")))
                .list();
        printListbook(list);
    }
    //or 和 and 查询  查询价格大于20 作者是sun  或者价格大于40的书籍信息
    @Test
    public void testAndOr(){
        List<Book> list =session.createCriteria(Book.class)
                //通过add添加条件
                .add(Restrictions.or(Restrictions.ge("price", 40d),
                        Restrictions.and(Restrictions.eq("author", "sun"),
                                Restrictions.ge("price", 20d))))
                .list();
        printListbook(list);
    }
    //排序
    @Test
    public void testOrder(){
        List<Book> list = session.createCriteria(Book.class)
                            .addOrder(Order.asc("price"))
                            .list();
        printListbook(list);
    }
    //分页
    @Test
    public void testPage(){
        List<Book> list = session.createCriteria(Book.class)
                .setFirstResult(0)
                .setMaxResults(2)
                .list();
        printListbook(list);
    }
    //聚合查询 使用Projections来完成
    @Test
    public void testCount(){
        Long result = (Long)session.createCriteria(Book.class)
                .setProjection(Projections.countDistinct("id"))
                .uniqueResult();
        System.out.println(result);
    }
}

6.过滤查询

a).定义过滤器---在hibernate-mapping中定义

<!-- 过滤器定义 -->
    <filter-def name="idFilter">
        <filter-param name="idParam" type="int"/>
    </filter-def>

b). 引用过滤器---在class标签中引用

<class name="Book" table="t_book">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>
        <property name="author"/>
        <property name="price"/>
        <property name="pubDate"/>
        <!-- 多对一的关联关系设置   column指定外键的名称 -->
        <many-to-one name="category" column="cid" fetch="join"/>
        <filter name="idFilter" condition=":idParam=id"></filter>
    </class>

c). 查询时使用

@Test
    public void testFilter(){
        session.enableFilter("idFilter")//启动过滤器
                .setParameter("idParam", 1);//设置过滤参数
        Book b=(Book)session.createQuery("from Book").uniqueResult();
        System.out.println(b.getName()+"---"+b.getAuthor());
    }

原文地址:https://www.cnblogs.com/Vincent-yuan/p/11216574.html

时间: 2024-10-11 11:47:42

java之hibernate之hibernate查询的相关文章

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hibernate. 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求

【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查

这篇文章有很多槽点,在Hibernate4.x上面用着Hibernate3.x的写法去写.而且程序中放到Eclipse中会有一大堆警告,但是这好歹也在一定程度上完成了Hibernate的入门.毕竟现在很多介绍Hibernate的书籍都是用Hibernate3.x的写法去写.上次那篇<[Hibernate]最简单的Hibernate工程--账号注册系统>(点击打开链接)杂糅Struts的技术其实是不对的.因为Hibernate完成的是,从Java到数据库,从数据库到Java的任务.之后Java与

java必备——经典的Hibernate

在编程开发中,我们有非常多框架,他们有些非常方便,也非常有用,今天我们一起来认识一个java经典的框架Hibernate,Hibernate英文名称为"冬眠".这是个非常有意思的技术,相同这个名字也非常巧妙! 大家先看看这个技术的书籍在国外的封面: 简单介绍: 大家知道冬眠的动物是精巧的,在冻僵的边缘,而Hibernate的一个巨大作用就是对数据持久化的实现.这两者有什么联系? 简介数据持久化: 数据持久化是解决程序与数据库之间交互訪问的问题,使程序不直接訪问数据库,而是直接訪问Ses

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据] 带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数 ---->select count(*) from [表名] where  [字段

使用hibernate原生sql查询,结果集全为1的问题解决

问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Object>> listTest = this.getService().getListBySql(sqlTest); for (Map<Object, Object> m : listTest) { for (Object k : m.keySet()) { System.out.pr

【Java基础之】Hibernate之360度环视

在介绍Hibernate之前,先介绍一下JDBC,Java Data Base Connectivity--Java数据库连接,是一种用于执行SQL语句的Java API,是一套访问数据库的标准,提供了一组接口,可以为多种关系数据库提供统一访问,是Java语言访问数据库用到的东西. 短短几句说完JDBC回来继续说Hibernate,Hibernate是当今很流行的一个ORM框架,是JPA的一个实现,完了,说说又得说说ORM和JPA.先说ORM,Object Relation Mapping对象关

java框架——经典的Hibernate

在编程开发中,我们有很多框架,他们有些很方便,也很实用,今天我们一起来认识一个java经典的框架Hibernate,Hibernate英文名称为"冬眠",这是个很有意思的技术,同样这个名字也很巧妙!大家先看看这个技术的书籍在国外的封面: 简介: 大家知道冬眠的动物是静止的,在冻僵的边缘,而Hibernate的一个巨大作用就是对数据持久化的实现,这两者有什么联系? 简单介绍数据持久化: 数据持久化是解决程序与数据库之间交互访问的问题,使程序不直接访问数据库,而是直接访问Session会话

Hibernate应用SQL查询返回实体类型

Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动帮我们注入到Hibernate 甚至是 非 Hibernate 类型当中. String sql = "select * from T_TMP_PUBLIC_POLICY TP"; SQLQuery sqluery = session.createSQLQuery(sql).addEnti

【Hibernate】Hibernate的多表查询

在<[Hibernate]Hibernate的聚类查询.分组查询.排序与时间之差>(点击打开链接)一文中已经讲述过怎样利用HQL语句代替SQL语句.进行聚类查询.分组查询.排序与时间之差的查询,同一时候指出hql能代替sql语句做不论什么事情.我原本以为hql语句的多表查询,要先对里面的实体做Java与xml的改动,事实上并不须要,相同是一句HQL语句就能搞定的事情.SQL的多表查询已经在<[Mysql]利用内连接与嵌套查询实现多表查询.主键.外键的基本概念>(点击打开链接)讲过.

Java Web开发之hibernate与mybatis的数据库连接

第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的一个子项目. MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html Hibernate参考资料: http://docs.jboss.org/hibernate/core/3.6/refe