您的位置:首页 > 数据库

Hibernate学习笔记 -- day10 OID、对象导航查询、原生SQL

2017-07-28 15:51 441 查看

一、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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐