一、OID查询
1、什么是OID查询
所谓实体查询即OID查询,就是使用主键作为条件来查询一个实体。其中涉及的方法是Session对象get方法和load方法。
2、get方法:
/**
* 根据id查询一个实体
* @param entityType 指的是要查询的实体类字节码对象
* @param id 查询的条件,即主键的值。
* @return 返回的是实体类对象
*/
<T> T get(Class<T> entityType, Serializable id);
3、load方法:
/**
* 根据id查询一个实体
* @param theClass 指的是要查询的实体类字节码
* @param id查询的条件,即主键的值。
* @return 返回的是实体类对象或者是实体类对象的代理对象
*/
<T> T load(Class<T> theClass, Serializable id);
4、get 和 load 方法的区别
(1)、查询时机不一样
get方法任何时候都是立即加载,即只要一调用get马上发起数据库查询
load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据才发起查询
load方法可以通过配置的方式改为立即加载
由于load方法是hibernate的方法所以只有XML的方式:
<class name="Customer" table="cst_customer" lazy="false">
(2)、返回的结果不一样
get方法永远返回查询的实体类对象。
load方法当是延迟加载时,返回的是实体类的代理对象。
(3)、代码演示
/**
* 根据id查询一个实体
*
* 涉及的方法:
* get(Class clazz,Serailizable id);
* load(Class clazz,Serailizable id);
* 区别:
* 1、加载的时机不一样
* get方法永远是立即加载。
* load方法默认是延迟加载。
* 立即加载:不管用不用,只要一调用方法,马上发起查询。
* 延迟加载:什么时候用,什么时候再发起查询。也叫懒加载(惰性加载)
* load方法可以通过配置的方式改为立即加载。
* 2、返回的结果不一样
* get返回的实体类对象
* load返回的是实体类对象的代理对象,当我们真正要获取数据时,它会对我们的方法进行增强,去查询。
*
*/
public class HibernateDemo1 {
/**
* get
*/
@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Customer c = s.get(Customer.class, 1L);//就立即发起查询,不管用不用
System.out.println(c.getCustId());
System.out.println(c.toString());
tx.commit();
}
/**
* load
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Customer c = s.load(Customer.class, 1L);//不会马上发起查询,什么时候用什么时候发起查询
System.out.println(c.getCustId());
System.out.println(c.toString());
tx.commit();
}
}
5、涉及的概念
类级别检索策略。检索策略也称为抓取策略。其实就是查询策略。
简单的说就是我们查询一个实体时,发起查询的时机在什么时候。
立即加载:是不管用不用马上查询。
延迟加载:等到用的时候才真正发起查询。
二、对象导航图查询
1、什么是对象导航图查询
使用的都是实体类中的方法。
2、明确:
对象导航查询需要思想的转变。
3、要求:
两个实体必须具有关联关系,没有关联关系的不能用。
4、含义:
实体:
get关联对象的实体
例如:
customer.getLinkMans()
linkman.getCustomer()
5、演示案例
/**在使用ORM持久层框架思想没有转变之前:
* 查询我的联系人
* 根据客户ID查询联系人信息
*/
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
SQLQuery sqlquery = s.createSQLQuery("select * from cst_linkman where lkm_cust_id = ? ");
sqlquery.setLong(0, 1L);
sqlquery.addEntity(LinkMan.class);//把查询结果封装到联系人的实体类中
List list = sqlquery.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}
/**在使用ORM持久层框架思想没有转变之后:
* 明确:任何一个实体,它都会有findById的方法。
*/
@Test
public void test1(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
Customer c = s.get(Customer.class,1L);
System.out.println(c);
System.out.println(c.getLinkmans());
tx.commit();
}
/**
* 对象导航查询
*/
@Test
public void test3(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
LinkMan l = s.get(LinkMan.class,1L);
System.out.println(l);
System.out.println(l.getCustomer());
tx.commit();
}
三、原生SQL语句查询
1、什么是SQL查询
使用原始的SQL语句来查询
2、涉及的对象:
第一种方式:session的doWork方法可以使用Connection
第二种方式:SQLQuery对象。它的获取方式是session.createSQLQuery(String sql);
在hibernate中用的不多。
3、案例演示
@Test
public void test2(){
Session s = HibernateUtil.getCurrentSession();
Transaction tx = s.beginTransaction();
SQLQuery sqlquery = s.createSQLQuery("select * from cst_linkman where lkm_cust_id = ? ");
sqlquery.setLong(0, 1L);
sqlquery.addEntity(LinkMan.class);//把查询结果封装到联系人的实体类中
List list = sqlquery.list();
for(Object o : list){
System.out.println(o);
}
tx.commit();
}