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

 

posted @ 2019-07-20 08:55  Vincent-yuan  阅读(1158)  评论(0编辑  收藏  举报