zoukankan      html  css  js  c++  java
  • 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());
        }
  • 相关阅读:
    接口测试基础知识
    WebSocket接口怎么做测试
    python的数据类型特点和常用方法
    python封装一个工具类 ,对MySQL数据库增删改查
    python 往MySQL批量插入数据
    python对MySQL进行曾删改查
    Rest Assured从入门到遇到各种问题(汇总、更新)
    jmeter参数化之动态读取csv文件
    Charles 浏览器(火狐)抓包设置
    导入git项目报错"no projects are found to import" 找不到项目
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/11216574.html
Copyright © 2011-2022 走看看