版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Hibernate的查询的方式
- 在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。
Hibernate的查询方式:OID查询
- OID检索:Hibernate根据对象的OID(主键)进行检索
使用get方法
Customer customer = session.get(Customer.class,1l);
使用load方法
Customer customer = session.load(Customer.class,1l);
Hibernate的查询方式:对象导航检索
- 对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();
Hibernate的查询方式:HQL检索(*****)
- HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
初始化一些数据
@Test
/**
* 初始化数据
*/
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//创建一个客户
Customer customer = new Customer();
customer.setCust_name("张三");
//创建联系人
for (int i = 1; i <= 10; i++) {
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("李四"+i);
customer.getLinkMans().add(linkMan);
linkMan.setCustomer(customer);
session.save(linkMan);
}
session.save(customer);
tx.commit();
}
HQL的简单查询
@Test
/**
* HQL的简单查询
*/
public void demo02() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//简单的查询
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
//sql中支持*的写法:select * from cst_customer;但是在HQL中不支持* 号的写法
/*
* Query query=session.createQuery("select * from Customer");//报错
*/
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
HQL的别名查询
@Test
/**
* * 别名查询
*/
public void demo03() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//别名查询
/*
* Query query = session.createQuery("from Customer c"); List<Customer> list =
* query.list();
*/
Query query= session.createQuery("select c from Customer c");
List<Customer> list =query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
HQL的排序查询
@Test
/**
* * 排序查询
*/
public void demo04() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//排序查询
//默认情况
//List<Customer> list = session.createQuery("from Customer order by cust_id").list();
//升序使用asc 降序使用desc
List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
HQL的条件查询
@Test
/**
* *条件查询
*/
public void demo05() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//条件查询
//一、按位置绑定:按参数的位置进行绑定
//一个条件
/*
* Query query = session.createQuery("from Customer where cust_name=?");
* query.setParameter(0, "张三"); List<Customer> list =query.list();
*/
//多个条件
// Query query = session.createQuery("from Customer where cust_name=? and cust_source like ?");
//
// query.setParameter(0, "张%");
// query.setParameter(1, "网络推广");
// List<Customer> list =query.list();
//二、按名称绑定
Query query = session.createQuery("from Customer where cust_source= :aaa and cust_name like :bbb");
//设置参数:
query.setParameter("aaa", "朋友推荐");
query.setParameter("bbb", "王%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
HQL的投影查询
- 投影查询:查询对象的某个或某些属性。
@Test
/**
* 投影查询
*/
public void demo06() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//投影查询
//单个属性
// List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
// for (Object object : list) {
// System.out.println(object);
// }
//多个属性
//
//查询多个属性,但是我想封装到对象中
List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source)from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
HQL的分页查询
@Test
/**
* 分页查询
*/
public void demo07() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//分页查询
Query query = session.createQuery("from LinkMan");
query.setFirstResult(0);
query.setMaxResults(10);
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
}
HQL的分组查询
@Test
/*
* 分组查询
*/
public void demo08() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//聚合函数的使用:count(),max(),min(),avg(),sum()
Object object = session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println();
//分组统计
List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
}
HQL的多表查询
- SQL 的多表查询
- 连接查询
- 交叉连接(一般不用):笛卡尔积
- select from A,B
- 内连接(查的是公共部分):inner join (inner 可以省略)
- 隐式内连接:select * from A,B where Aid=B.aid;
- 显示内连接:select * from A inner join B on A_id=B.aid;
- 外连接
- 左外连接(左+公共部分):left outer join(outer可以省略)
- select * from A left outer join B on A.id=B.aid;
- 右外连接(右+公共部分):right outer join(outer可以省略)
- select * from A left outer join B on A.id=B.aid;
- 左外连接(左+公共部分):left outer join(outer可以省略)
- 交叉连接(一般不用):笛卡尔积
- 子查询
- 连接查询
- HQL的多表查询
- 连接查询
-
交叉连接
-
内连接(内连接时封装成Object 数组)
- 显示内连接
- 隐式内连接
- 迫切内连接(迫切内连接是装到对象中)
-
外连接
- 左外连接
- 右外连接
- 迫切左外连接
-
- 连接查询
@Test
/**
* HQL的多表查询
*/
public void demo09() {
Session session=HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//
// //HQL:内连接from Customer c inner join c.linkMans
// List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
// for (Object[] objects : list) {
// System.out.println(objects);
// }
//HQL:迫切内连接 其实就是在普通的内连接inner join后添加一个关键字fetch.
//distict去掉重复对象
List<Customer> list=session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();//fetch 通知hibernate,将另一个对象的数据封装到该对象中
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}