专栏首页Vincent-yuanjava之hibernate之hibernate查询

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());
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手动搭建自己的nuget服务器及使用

    但是,如果我们想在我们的私有nuget服务器上有这个包,我们还需要把.nuget文件传到我们私有nuget服务器上;

    Vincent-yuan
  • asp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)

    AddPolicy 在StartUp.ConfigureServices方法中调用;对于一些选项,先阅读一下,CORS是怎么工作的,可能会有帮助

    Vincent-yuan
  • SQL Server 连接字符串总结

    使用服务器名\实例名作为连接指定SQL Server实例的数据源。如果你使用的是SQL Server 2008 Express版,实例名为SQLEXPRESS。

    Vincent-yuan
  • 一日一技:在Python里面判断多个变量全部/任意不为空

    我们在写Python 函数的时候,可能会需要判断传入的多个参数是否同时为空/None/False,或者是否有任何一个不为空/None/False。可能有人会这样...

    青南
  • 流畅的python

    流畅的python中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库。介绍了很多python的不常用的数据类型、操作、库等,对于入门pyth...

    用户2398817
  • 《Kotlin 极简教程 》第5章 集合类(1)

    本章将介绍Kotlin标准库中的集合类,我们将了解到它是如何扩展的Java集合库,使得写代码更加简单容易。如果您熟悉Scala的集合库,您会发现Kotlin跟S...

    一个会写诗的程序员
  • 【前端艺术】超酷圆形导航菜单特效(基于SVG)

    这是一款基于SVG的超酷圆形导航菜单特效。该导航菜单通过SVG进行布局,然后通过js和CSS代码来在鼠标hover菜单时,制作菜单项的动画效果。

    用户5997198
  • Linux记录执行的命令并通过Rsyslog集中存储

    原文地址:https://blog.51cto.com/liqingbiao/2119953

    二狗不要跑
  • 人生苦短:Python里的17个超赞操作

    有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如:

    一墨编程学习
  • 安利一波Python编程中非常实用的那些黑魔法

    编者按:Python是机器学习的主流语言,没有之一。今年5月,它首次在PYPL排行榜上超越JAVA,成为全球第一大编程语言。而一个月后,Stack Overfl...

    猫咪编程

扫码关注云+社区

领取腾讯云代金券