博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java之hibernate之hibernate查询
阅读量:5038 次
发布时间:2019-06-12

本文共 10459 字,大约阅读时间需要 34 分钟。

这篇主要简单间接 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
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
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
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
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
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
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
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
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
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
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
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
list = session.createQuery(hql).list(); for(Object[] temp:list){ System.out.println(temp[0]+"----"+temp[1]+"----"+temp[2]); } } //命名查询 /** *在映射文件中配置好 如下命名查询
from Book;
*/ @Test public void testNamedQuery(){ List
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
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
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
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
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
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
list =session.createCriteria(Book.class).list(); printListbook(list); } private void printListbook(List
list) { for(Book b:list){ System.out.println(b.getName()+"---"+b.getAuthor()); } } //条件查询 使用Restrictions类的静态方法 添加各种条件 @Test public void testCondition(){ List
list =session.createCriteria(Book.class) //通过add添加条件 .add(Restrictions.ge("price", 40d)) .list(); printListbook(list); } //多个条件and查询 价格大于20 并且 作者是sun @Test public void testMultiConditionAnd(){ List
list =session.createCriteria(Book.class) //通过add添加条件 .add(Restrictions.ge("price", 20d)) .add(Restrictions.eq("author", "sun")) .list(); printListbook(list); } @Test public void testMultiConditionAnd1(){ List
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
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
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
list = session.createCriteria(Book.class) .addOrder(Order.asc("price")) .list(); printListbook(list); } //分页 @Test public void testPage(){ List
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中定义

b). 引用过滤器---在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

你可能感兴趣的文章
Dynamics365解决方案的新特性
查看>>
预生成事件/生成后事件命令行对话框
查看>>
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>
(转)Intent的基本使用方法总结
查看>>
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
安卓电量优化之AlarmManager使用全部解析
查看>>
apache服务器中设置目录不可访问
查看>>