Hibernate的检索方式

1.1 Hibernate的检索方式 :
1.1.1 Hibernate的检索方式 :
检索方式:查询的方式:
导航对象图检索方式:  根据已经加载的对象导航到其他对象
* Customer customer = (Customer)session.get(Customer.class,1);
* customer.getOrders();// 获得到客户的订单
OID 检索方式:  按照对象的 OID 来检索对象
* get()/load();方法进行检索.
HQL 检索方式: 使用面向对象的 HQL 查询语言
* Query query = session.createQuery(“HQL”);
QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
* Criteria criteria = session.createCriteria(Customer.class);
本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
* SQLQuery query = session.createSQLQuery(“SQL”);

1.1.1 HQL:
HQL:Hibernate Query Language:
* 特点:
* 面向对象的查询:
* 支持方法链编程:
* 使用:
1.创建Query接口.
 
1.查询所有记录:
List<Customer> list = session.createQuery("from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
 
2.查询使用别名:
// 使用别名
// 别名as可以省略
/*  List<Customer> list =  session.createQuery("from Customer  c").list();
   System.out.println(list);*/
 
 
// 使用别名:带参数
/*List<Customer> list = session.createQuery("from Customer as c where c.cname = ? ")
. setString(0, "小沈").list();
System.out.println(list);*/
// 不支持 select * from Customer写法.可以写成 select 别名 from Customer as 别名;
List<Customer> list = session.createQuery("select c from Customer c").list();
System.out.println(list);
 
3.排序:
List<Customer> list = session.createQuery(
"from Customer c order by c.id desc").list();
for (Customer customer : list) {
System.out.println(customer);
}
 
4.分页查询:
Query query = session.createQuery("from Order");
//分页第一条记录的索引,计算公式 (page-1)*pageSize,page为要显示的第几页,pageSize为每页要显示的记录数
query.setFirstResult(20);
query.setMaxResults(10);
List<Order> list = query.list();
for (Order order : list) {
System.out.println(order);
}
 
5. 单个对象查询:
Customer customer = (Customer) session
.createQuery("from Customer where cname = ?")
.setString(0, "小明"). uniqueResult();
System.out.println(customer);
 
6.参数绑定:
// 1.使用?号方式绑定
/*Query query = session.createQuery("from Customer where cname = ?");
query. setString(0, "小沈");
List<Customer> list = query.list();
System.out.println(list);*/
/*Query query = session.createQuery("from Customer where cname = ? and cid = ?");
query. setString(0, "小沈");
query. setInteger(1,3);
List<Customer> list = query.list();
System.out.println(list);*/
// 2.使用名称的方式绑定(=:name 里面不能有空号)
Query query = session.createQuery("from Customer where cname=:name and cid=:id");
query. setString("name", "小沈");
query.setInteger("id", 3);
List<Customer> list = query.list();
System.out.println(list);
 
// 3.绑定实体
List<Order> list = session
.createQuery("from Order o where o.customer = ?")
. setEntity(0, customer).list();
for (Order order : list) {
System.out.println(order);
}
 
7.投影操作:
// 查询客户的名称:
/*
 * List<Object> list = session.createQuery("select c.cname from Customer c").list();
System.out.println(list);
 */
 
/*
 * List<Object[]> list = session.createQuery("select c.cid,c.cname from Customer c").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}

 */
 
List<Customer> list = session.createQuery(
"select new Customer(cname) from Customer").list();
System.out.println(list);
 
8.模糊查询:
Query query = session.createQuery("from Customer where cname like ?");
//经个人测试,setString()方法也可以
query. setParameter(0, "小%");
List<Customer> list = query.list();
System.out.println(list);
 
SQL多表查询:
* 连接:
* 交叉连接:
* select * from A,B;
* 内连接:查询的是两个表的交集!
* select * from A inner join B on A.字段 = B.字段;
* 隐式内连接:
* select * from A,B where A.字段 = B.字段;
* 外连接:
* 左外连接:
*left join 和 left outer join效果一样,A记录全部出来,如果B表没对应的就为null
* select * from A left outer join B on  A.字段 = B.字段;
* 右外连接:
*right join 和 rightouter join效果一样,B记录全部出来,如果A表没对应的就为null
* select * from A right outer join B on A.字段 = B.字段;
 
HQL多表的查询:
* 连接:
* 交叉连接:
* 内连接:
* 隐式内连接:
* 迫切内连接:
* 左外连接:
* 迫切左外连接:
* 右外连接:
 
* HQL的内连接和迫切内连接区别:
* 内连接查询 : 将数据封装一个List<Object[]>中.
* 迫切内连接 : 将数据封装一个List<Customer>中.但是 迫切内连接,得到会有重复记录 ,需要使用distinct排重.重复记录是一个客户有多个订单,所以会展示多条同一个客户的记录,等同SQL正常的链接查询
1.1.2 QBC:
1.查询所有记录:
List<Customer> list = session.createCriteria(Customer.class).list();
for (Customer customer : list) {
System.out.println(customer);
}
 
2.排序:
List<Customer> list = session.createCriteria(Customer.class)
. addOrder(org.hibernate.criterion.Order.desc("id")).list();
for (Customer customer : list) {
System.out.println(customer);
}
 
3.分页:
Criteria criteria = session.createCriteria(Order.class);
//分页第一条记录的索引,计算公式 (page-1)*pageSize,page为要显示的第几页,pageSize为每页要显示的记录数
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<Order> list = criteria.list();
for (Order order : list) {
System.out.println(order);
}
 
4.获取单个对象:
Customer customer = (Customer) session.createCriteria(Customer.class)
. add(Restrictions.eq("cname", "小明")). uniqueResult();
System.out.println(customer);
 
5.带参数的查询:
/*
 * List<Customer> list = session.createCriteria( Customer.class)
 * .add(Restrictions.eq("cname", "小明")).list();
 * System.out.println(list);
 */
 
List<Customer> list = session.createCriteria(Customer.class)
.add(Restrictions.eq("cname", "小明"))
.add(Restrictions.eq("cid", 2)).list();
System.out.println(list);
 
6.模糊查询:
Criteria criteria = session.createCriteria(Customer.class);
criteria. add(Restrictions.like("cname", "大%"));
List<Customer> list = criteria.list();
System.out.println(list);
 
7.离线条件查询
(高级查询:啥根据姓名查询,性别,学历,是否上传简历等等)
*在web层封装
* DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
*criteria.add(Restriction.eq("id",1));
*CustomerService service=new CustomerSerivce();
*service.findById(criteria); ----->再传递到Dao层
*传递到Dao层
Session session=HibernateUtils.openSession();
Transcation tx=session.beginTransaction();
Criteria c= criteria . getExecutableCriteria(session);
 
1.1.3 SQL:
1.SQL语句查询所有记录:
List<Object[]> list = session.createSQLQuery("select * from customer").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
 
List<Customer> list = session.createSQLQuery("select * from customer")
.addEntity(Customer.class).list();
for (Customer customer : list) {
System.out.println(customer);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值