java之hibernate之hibernate查询
Posted vincent-yuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());
以上是关于java之hibernate之hibernate查询的主要内容,如果未能解决你的问题,请参考以下文章