* HQL 检索方式: 使用面向对象的 HQL 查询语言
* QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口
* 本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
* HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式
* Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型
* HQL vs SQL:
HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性
SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段
* Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能
1.简单的查询
Query query=session.createQuery("from Customer c where c.name='tom'");
List<Customer> list=query.list();
* debug watch表达式 query.list 会多两条查询语句 表达式上点orders才会查询orders集合
Criteria cr=session.createCriteria(Customer.class);
Criterion cn=Restrictions.eq("name", "tom");
cr.add(cn);
List<Customer> list=cr.list();
* 使用qbc Criteria标准化查询接口
* 每个Criterion对象表示一个查询条件
* Expression.eq("name", "tom");
2.多态查询
Query query=session.createQuery("from java.io.Serializable o");
query.list();
* 查询所有实现了序列化接口的持久化类
Query query=session.createQuery("from java.lang.Object o");
query.list();
* 查询所有继承了Object类的持久化类
3.对查询结果排序
Query query=session.createQuery("from Customer c order by c.id desc");
query.list();
* desc 降序 asc 升序 默认升序
Criteria cr=session.createCriteria(Customer.class);
cr.addOrder(org.hibernate.criterion.Order.desc("id"));
cr.list();
* qbc查询方式
4.分页查询
Query query=session.createQuery("from Order o order by o.id desc");
query.setFirstResult(0);
query.setMaxResults(10);
query.list();
* 查询第一条到第十条数据
Criteria cr=session.createCriteria(Order.class);
cr.addOrder(org.hibernate.criterion.Order.desc("id"));
cr.setFirstResult(0);
cr.setMaxResults(10);
cr.list();
5.检索单个对象
Query query=session.createQuery("from Customer c where c.name='tom'");
query.uniqueResult();
6.1绑定参数的形式,按参数名称绑定
Query query=session.createQuery("from Customer c where c.name=:cname and c.age=:cage");
//第一个参数代表名字,第二个参数代表值
query.setString("cname", "tom");
query.setInteger("cage", 32);
query.list();
6.2绑定参数的形式,按参数位置绑定
Query query=session.createQuery("from Customer c where c.name=? and c.age=?");
//第一个参数代表名字,第二个参数代表值
query.setString(0, "tom");
query.setInteger(1, 32);
query.list();
7.在映射文件中定义命名查询语句
hibernate映射文件
<query name="fingCustomerByName">
<![CDATA[from Customer c where c.name like ?]]>
</query>
java类调用查询方法
Query query=session.getNamedQuery("fingCustomerByName");
query.setString(0, "%t%");
query.list();
8.迫切左外连接
Query query=session.createQuery("from Customer c left outer join fetch c.orderes where c.name like ?");
query.setString(0, "%tom%");
List<Customer> list=query.list();
for(int i=0;i<list.size();i++){
Customer c=list.get(i);
System.out.println(c.getId()+" "+c.getName()+"****************************************");
Set orderes=c.getOrderes();
Iterator<Order> it=orderes.iterator();
while(it.hasNext()){
Order o=it.next();
System.out.println(o.getId()+" "+o.getOrderNumber());
}
}
* 返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合
9.左外连接
Query query=session.createQuery("from Customer c left outer join c.orderes where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
for(int i=0;i<list.size();i++){
Object[] pair=(Object[])list.get(i);
Customer c=(Customer)pair[0];
Order o=(Order)pair[1];
System.out.println(c.getId()+" "+c.getName()+"* "+o.getId()+" "+o.getOrderNumber());
}
* 语句和迫切左外差不多是一样的,迫切左外重复查询了几个字段
* 返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象
* 左连接 ,查询右边满足左边的数据
10. 内连接
Query query=session.createQuery("from Customer c join c.orderes where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
* 查询左边和右边条件相等的数据
* 返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象
11.迫切内连接
Query query=session.createQuery("from Customer c inner join fetch c.orderes where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
* 返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合
12.右连接
Query query=session.createQuery("from Customer c right outer join c.orderes where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
* 右连接 ,查询左边满足右边的数据
13.交差连接
* 交叉连接,也就是笛卡尔积,查两张表时,没有条件限制,如果左表有n条数据,右表有m条数据,则最后查询出来一共有n*m条数据
14.投影查询
Query query=session.createQuery("select c.name, o.orderNumber,o.price from Customer c inner join c.orderes o where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
* 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现
* 返回值是一个对象数组,数组中存放的查询的属性值
15.使用构造函数封装查询的信息
Query query=session.createQuery("select new cn.itcast.search.CustomerRow(c.name, o.orderNumber,o.price) from Customer c inner join c.orderes o where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
* 返回的list集合存放的CustomerRow对象
16.报表查询 查询有多少客户
Query query=session.createQuery("select count(o) from Customer o");
Long count=(Long)query.uniqueResult();
* count(*)也可以 统计有多少条记录 count(o) 是以Customer的id来统计的
* 返回的是Long类型
17.报表查询 分组
Query query=session.createQuery("select o.name,count(*) from Customer o group by o.name");
query.list();
* 查询的东西必须要在group by 后面 除了统计函数