Hibernate03 -查询方式 OID hql QBC

Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC

Hibernate查询方式

  • 对象导航查询

    ​ 根据id查询某个客户,再查询这个客户里面所有的联系人

  • OID查询

    ​ 根据id查询某一条记录,返回对象

  • HQL查询

    ​ Query对象,写hql语句实现查询

  • QBC查询

    ​ Criteria对象

  • 本地sql查询

    ​ SQLQuery对象,使用普通sql实现查询

对象导航查询

查询某个客户里面所有联系人过程,使用对象导航实现

代码:

// 根据cid=1客户 在查询这个客户所有的联系人
Customer customer = session.get(Customer.class, 1);
// 在查询这个客户所有的联系人
// 直接得到客户里面联系人的set集合
Set<LinkMan> linkManSet = customer.getLinkManSet();
System.out.println(linkManSet.size());

OID查询

根据id查询记录 可以根据session中get方法查询

Customer customer = session.get(Customer.class, 1);

HQL查询

Query对象,写hql语句实现查询

hql: hibernate query language 和普通的sql很相似

区别:

  • 普通sql操作的是数据库的表和表的字段
  • hql操作的是实体类和属性

Query对象:

  • 创建Query对象 ,写hql
  • 调用Query对象里面的方法 得到结果

常见的HQL语句

查询所有

// 创建query对象 (from 实体类名)
Query query = session.createQuery("from Customer");
// 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
    System.out.println(customer.getCid() +":"+customer.getCustName());
}

条件查询

from 实体类名称 where 实体类属性=?and 实体类属性=?

from 实体类名称 where 实体类属性 like ?模糊查询

代码:

注意: 新版本现在的占位符?后面要带上索引位置 新的jpa格式

// 创建query对象
// Query query = session.createQuery("from Customer where cid=? and custName=?");
// 起别名
Query query2 = session.createQuery("from Customer c where c.cid=?1 and c.custName=?2");
// 设置条件值
// setParameter方法中有两个参数
// 第一个参数: int类型是?位置  从0开始
// 第二个参数: ?位置的值
query2.setParameter(1,1);
query2.setParameter(2,"baidu");

// 调用方法得到结果
List<Customer> list = query2.list();
for (Customer customer : list) {
    System.out.println(customer.getCid() + ":" + customer.getCustName());
}

排序查询

代码 降序desc 升序默认/asc

// 创建query对象
Query query = session.createQuery("from Customer order by cid desc");
List<Customer> list = query.list();
for (Customer customer : list) {
    System.out.println(customer);
}

分页查询

1 mysql实现分页

​ 使用关键字 limit实现

2 在hql中实现分页

​ 在hql操作中,在语句里面不能写limit,hibernate的Query对象封装两个方法实现分页操作

代码

// 创建query对象
// 写查询的操作
Query query = session.createQuery("from Customer ");
// 设置分页数据
// 设置开始位置
query.setFirstResult(0);
// 每页记录数
query.setMaxResults(2);
List<Customer> list = query.list();
for (Customer customer : list) {
    System.out.println(customer);
}

投影查询

什么是投影查询?

​ 查询部分属性(字段)的值…

语法

​ select 实体类属性1,实体类属性2 from 实体类名称

:select 后面不能写* 不支持的

代码实现

// 创建query对象
// 写查询的操作
Query query = session.createQuery("select custName from Customer ");
List<Object> list = query.list();
for (Object o : list) {
    System.out.println(o);
}
// 多个字段
// 写查询的操作
Query query = session.createQuery("select custName,cid  from Customer ");
List<Object[]> list = query.list();
for (Object[] o : list) {
    System.out.println(o[0]+o[1]);
}

聚集函数使用

常用的聚集函数

count、sum、avg、max、min

// 创建query对象
 // 写查询的操作
 Query query = session.createQuery("select count(*) from Customer ");
 // 调用方法得到结果
 // query对象里面有方法,直接返回对象形式(object)
 // 本身返回的的long类型
 Long o = (Long) query.uniqueResult();
 // 使用Integer类型来接收
 Integer i = o.intValue();
 System.out.println(i);

HQL多表查询

内连接查询(两个表有联系)

mysql

select * from t_customer c,t_linkeman l where c.cid = l.cid;

select * from t_customer c inner join t_linkman l on c.cid = l.cid

hql

//   实体类             属性
from Customer c inner join c.linkManSet 
// 返回的是数组

迫切内连接

from Customer c inner join fetch c.linkManSet 
// 返回的是Customer

迫切内连接和内连接区别:

​ 迫切内连接返回的list每部分是对象

​ 内连接返回的list每部分是数组

左外连接(全部显示)

mysql

select * from t_customer c left outer join t_linkman l on c.cid = l.cid

hql

==

//   实体类             属性
from Customer c left outer join c.linkManSet 
// 返回的是数组

迫切左外连接

from Customer c left outer join fetch c.linkManSet 
// 返回的是Customer

右外连接(全部显示)

mysql

select * from t_customer c right outer join t_linkman l on c.cid = l.cid

hql

from  Customer  c  right  outer  join  c.linkManSet

QBC查询

  • 使用hql查询需要写hql语句实现,但是使用qbc的时候 不需要写语句了,使用方法实现。
  • 使用qbc时候,操作实体类和属性
  • 使用qbc,使用Criteria对象实现

查询所有

// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for (Customer customer : list) {
    System.out.println(customer);
}

条件查询

 // 创建Criteria对象
 Criteria criteria = session.createCriteria(Customer.class);
 // 使用Criteria里面的方法设置条件值
 // add方法 设置条件值
 criteria.add(Restrictions.eq("cid",1));
 criteria.add(Restrictions.eq("custName","baidu"));
 List<Customer> list = criteria.list();
 for (Customer customer : list) {
     System.out.println(customer);
 }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QShzvJ1M-1597224319457)(…/AppData/Roaming/Typora/typora-user-images/image-Hibernate03 -查询方式 OID hql QBC_第1张图片

顺序查询

// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设置对那个属性进行排序,设置排序规则
// criteria.addOrder(Order.asc("cid"));
criteria.addOrder(Order.desc("cid"));

List<Customer> list = criteria.list();
for (Customer customer : list) {
    System.out.println(customer);
}

分页查询

// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设置分页开始位置 每页记录数
criteria.setFirstResult(0);
criteria.setMaxResults(2);

统计查询(count)

// 设置操作
criteria.setProjection(Projections.rowCount());
// 调用方法 得到最后的结果
Object o = criteria.uniqueResult();
Long l = (Long) o;
Integer i = l.intValue();
System.out.println(i);
sion.createCriteria(Customer.class);
// 设置分页开始位置 每页记录数
criteria.setFirstResult(0);
criteria.setMaxResults(2);

统计查询(count)

// 设置操作
criteria.setProjection(Projections.rowCount());
// 调用方法 得到最后的结果
Object o = criteria.uniqueResult();
Long l = (Long) o;
Integer i = l.intValue();
System.out.println(i);

Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC

你可能感兴趣的:(ssh,hibernate)