Hibernate查询操作

  • 一.对象导航查询
  • 1.根据id查询某个客户,再想查询这个客户里的所有联系人
  • 2.代码
  • 二.OLD查询
  • 1.根据id查询某一条记录,返回对象
  • (1)session中的get方法
  • 三.HQL查询
  • 1.Query对象,写hql语句查询
  • 2.常用hql
  • (1)查询所有
  • (2)条件查询
  • (3)排序查询
  • (4)分页查询
  • (5)投影查询
  • (6)聚集函数查询使用
  • 3.使用hql查询操作时,使用Query对象
  • (1)创建Query对象,写hql语句
  • (2)调用query对象里面的方法得到结果
  • 四.QBC查询
  • 1.使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现
  • 2.使用qbc ,操作实体类和属性
  • 3.使用qbc ,使用Criteria对象实现
  • 4.各种方法实用:
  • (1)查询所有
  • (2)条件查询
  • (2)条件查询
  • (3)排序查询
  • (4)分页查询
  • (5)统计查询
  • (6)离线查询
  • 五.HQL多表查询
  • 1.内连接
  • (1)内连接查询hql语句语法,以客户和联系人为例
  • 4.迫切内连接
  • (1)迫切内连接和内连接底层实现是一样的
  • (2)区别:使用内连接返回list中每部分是数组,而迫切内连接返回的是对象
  • 2.左外连接
  • 5.迫切左外连接
  • 3.右外连接
  • 五.hiebernate 检索策略
  • 1.检索策略的概念
  • 2.hibernate 分为两类
  • (1)立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库
  • (2)延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
  • 3.hibernate 延迟查询 分为两类
  • (1)类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句
  • (2)关联级别延迟:



一.对象导航查询

1.根据id查询某个客户,再想查询这个客户里的所有联系人

2.代码

Customer customer = session.get(Cusertomer.class . 1);
Set<LinkMan> linkman = customer.getSetLinkMan();

二.OLD查询

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

(1)session中的get方法


三.HQL查询

1.Query对象,写hql语句查询

2.常用hql

(1)查询所有

  • from 实体类名称
//查询所有客户
//1.创建Query对象,写hql语句  2.调用query对象里面的方法得到结果
Query query = session.createQuery("from Customer");
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(2)条件查询

  • from 实体类名称 where 实体类属性名称= ? AND 实体类属性名称= ?
  • 设置值时 使用 setParameter(int arg0 , Object arg1)方法 参数位置是从0开始
  • 若是使用模糊查询 设置参数是写 “%小%” 即可
//查询所有客户
//1.创建Query对象
Query query = session.createQuery("from Customer c where  c.cid = ? and  c.cname = ?");
//2.设置条件值
//第一个参数 int类型是?位置  ,从0开始计数
//第二个参数 具体的值
query.setParameter(0, 1);
query.setParameter(1, "百度");

//3得到结果
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(3)排序查询

  • from 实体类名称 order by 实体类属性名称 asc/desc

(4)分页查询

Query query = session.createQuery("from Customer");
//设置分页开始位置
query.setFirstResult(0);
//设置每页记录数
query.setMaxResults(3);
//调用方法获取结果
List<Customer> list= query.list();
for(Customer c : list){
		sout(c);
}

(5)投影查询

  • 查询部分字段的值 select cid from t_customer
  • select 实体类属性名称1 , 实体类属性名称2 from 实体类名称
  • select 后面是不可以写 * ,不支持

(6)聚集函数查询使用

  • 常用聚合函数 count sum avg max min
  • 查询表的记录数 select count(*) from 实体类名称
Query query = session.createQuery("select count(*) from Customer");
//获取结果
Object obj = query.uniqueResult();
//类型转换
Long lobj = (Long)obj;
int count = lobj.intValue();
sout(count )

3.使用hql查询操作时,使用Query对象

(1)创建Query对象,写hql语句

(2)调用query对象里面的方法得到结果

四.QBC查询

1.使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现

2.使用qbc ,操作实体类和属性

3.使用qbc ,使用Criteria对象实现

4.各种方法实用:

(1)查询所有

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2调用方法得到结果
List<Customer>  list = criteria.list();
//输出
sout(count )

(2)条件查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用add方法,添加条件值
criteria.add(Restricitions.eq("cid",1));
criteria.add(Restricitions.eq("customer","百度"));
//输出
List<Customer>  list = criteria.list();

preparedStatementSetter 查询in tether查询_内连接

(2)条件查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用add方法,添加条件值
criteria.add(Restricitions.eq("cid",1));
criteria.add(Restricitions.eq("customer","百度"));
//输出
List<Customer>  list = criteria.list();

(3)排序查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2使用addOrder方法中的Order.desc("cid") ,添加条件值
criteria.addOrder(Order.desc("cid"));
//输出
List<Customer>  list = criteria.list();

(4)分页查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2设置开始位置
criteria.setFirstResults(0);
//2设置每页记录数
criteria.setMaxResults(3);
//输出
List<Customer>  list = criteria.list();

(5)统计查询

//1创建对象
Criteria criteria = session.createCriteria(Custermoer.class);
//2。设置操作
criteria.setProjection(Projections.rowCount())
//3.得到结果
Object obj = criteria。uniqueResult();
Long lobj = (Long)obj;
int count = lobj.intValue();
sout(count);

(6)离线查询

//1创建对象
//Criteria criteria = session.createCriteria(Custermoer.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Cutomer.class);
//2 
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Cutomer> list = criteria.list();

五.HQL多表查询

1.内连接

(1)内连接查询hql语句语法,以客户和联系人为例

  • from Customer c inner join c.setLinkMan
  • 返回list , list里面每部分是数组的形式

4.迫切内连接

(1)迫切内连接和内连接底层实现是一样的

(2)区别:使用内连接返回list中每部分是数组,而迫切内连接返回的是对象

  • from Customer c inner join fetch c.setLinkMan

2.左外连接

  • from Customer c left outer join c.setLinkMan
  • 返回list , list里面每部分是数组的形式

5.迫切左外连接

  • from Customer c left outer join fetch c.setLinkMan

3.右外连接


五.hiebernate 检索策略

1.检索策略的概念

2.hibernate 分为两类

(1)立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库

(2)延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库

3.hibernate 延迟查询 分为两类

(1)类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句

  • 即为 load方法实现

(2)关联级别延迟:

  • 想要查询某个客户,再想查询这个客户的所有联系人 ,,查询客户的所有联系人的过程是否需要延迟