Hibernate共提供以下三种检索方式
HQL检索方式:
1.通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
2.动态绑定参数
3.调用 Query 的 list() 方法执行查询语句. 该方法返回java.util.List 类型的集合, 在 List 集合中存放了符合查询条件的持久化对象.
4.Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例
Hibernate 的参数绑定机制依赖于JDBC中的 PreparedStatement 的预定义 SQL 语句功能.
两种形式:
按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.(hibernate特有)
Query query = session.createQuery("from Classes where name=:name1"); query.setParameter("name1", "asdj");
按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
Query query = session.createQuery("from Classes as c where c.name=?"); query.setParameter(0, "asdj");//别名as,可省略
HQL采用ORDER BY关键字对查询结果排序
Query query = session.createQuery("from Classes as c order by c.id"); List<Classes> classes = query.list();
分页查询
setFirstResult(intfirstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
setMaxResult(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
List<Classes> classes = query.setFirstResult(1).setMaxResults(5).list();
投影查询:
查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
Query的list()方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录
可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录
可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素
from Customer c join c.orders o where o.orderNumber like ‘X%’ 如果希望查询结果中只包含Customer对象,可使用以下形式 select c from Customer c join c.orders o where o.orderNumber like X%’ Select关键字还能用于选择对象的部分属性 session.createQuery("select c.id,c.name,o.orderNumber from Customer c join c.orders o where o.orderNumber like 'X%'") 其对应的sql语句为 select c.id,c.name,o.ORDER_NUMBER from CUSTOMERS c inner join ORDERS o on c.ID = o.CUSTOMER_ID where o.ORDER_NUMBER like 'X%' 通过 DISTINCT 过滤重复元素 createQuery("select distinct c.name from customer c");
Query query = session.createQuery("select " new cn.abc.Customer(c.id,c.name,o.orderNumber) " + " from Customer c join c.orders o where o.orderNumber like '%X%'"); List list = query.list();
List list=session.createQuery("select c.name,count(c) from Customer c group by c.name").list(); System.out.println(list.size());
Query query = session.createQuery("select count(*) from Customer c"); Integer count=(Integer)query.uniqueResult(); System.out.println("count "+count); Query query = session.createQuery("select avg(c.age) from Customer c"); Float avg=(Float)query.uniqueResult(); System.out.println("avg "+avg); Query query = session.createQuery("select max(c.age),min(c.age) from Customer c"); Object[] objs=(Object[])query.uniqueResult(); System.out.println("max "+(Long)objs[0]); System.out.println("min "+(Long)objs[1]); Query query = session.createQuery("select sum(c.age) from Customer c"); Long sum=(Long)query.uniqueResult(); System.out.println("sum "+sum);
短语 |
含义 |
Restrictions.eq |
等于= |
Restrictions.allEq |
使用Map,使用key/value进行多个等于的判断 |
Restrictions.gt |
大于> |
Restrictions.ge |
大于等于>= |
Restrictions.lt |
小于< |
Restrictions.le |
小于等于<= |
Restrictions.between |
对应sql的between子句 |
Restrictions.like |
对应sql的like子句 |
Restrictions.in |
对应sql的in子句 |
Restrictions.and |
and 关系 |
Restrictions.or |
or关系 |
Restrictions.sqlRestriction |
Sql限定查询 |
Criteria criteria=session.createCriteria(Customer.class); //设定查询条件,每个Criterion实例代表一个查询条件 Criterion cn1=Restrictions.eq("name", "tom1"); criteria.add(cn1); list=criteria.list();
应用的时候从帮助文档看看例子即可
本地SQL的查询方式
query = session.createSQLQuery(本地sql语句);