hibernate(5)导航对象图、OID、HQL、QBC、SQL检索方式

一、hibernate中的5种检索方式

      1.1、导航对象图检索方式  

          根据已经加载的对象导航到其他对象

          例如:在前面的各种映射关系中,实体类包含对其他类对象的引用。

       

      1.2、OID检索方式

                                    主要指用Session的get()和load()方法加载某条记录对应的对象。

                                    例如:session.get()/session.load()  

 

      1.3、HQL检索方式

查询所有客户

@Test

public void demo01(){

//1 查询所有

Session session = factory.openSession();

session.beginTransaction();

 

//1  使用简单类名 , 存在自动导包

// * Customer.hbm.xml <hibernate-mapping auto-import="true">

// Query query = session.createQuery("from Customer");

//2 使用全限定类名

Query query = session.createQuery("from com.itheima.a_init.Customer");

 

List<Customer> allCustomer = query.list();

for (Customer customer : allCustomer) {

System.out.println(customer);

}

 

session.getTransaction().commit();

session.close();

}

选择查询

@Test

public void demo02(){

//2 简单条件查询

Session session = factory.openSession();

session.beginTransaction();

 

 

//1 指定数据,cid OID名称

// Query query = session.createQuery("from Customer where cid = 1");

//2 如果使用id,也可以(了解)

// Query query = session.createQuery("from Customer where id = 1");

//3 对象别名 ,格式: 类 [as] 别名

// Query query = session.createQuery("from Customer as c where c.cid = 1");

//4 查询所有项,mysql--> select * from...

Query query = session.createQuery("select c from Customer as c where c.cid = 1");

 

Customer customer = (Customer) query.uniqueResult();

System.out.println(customer);

 

session.getTransaction().commit();

session.close();

}

 

投影查询(部分)

@Test

public void demo04(){

//4 投影

Session session = factory.openSession();

session.beginTransaction();

 

//1 默认

//如果单列 ,select c.cname from,需要List<Object>

//如果多列,select c.cid,c.cname from ,需要List<Object[]>  ,list存放每行,Object[]多列

// Query query = session.createQuery("select c.cid,c.cname from Customer c");

//2 将查询部分数据,设置Customer对象中

// * 格式:new Customer(c.cid,c.cname)

// * 注意:Customer必须提供相应的构造方法。

// * 如果投影使用oid,结果脱管态对象。

Query query = session.createQuery("select new Customer(c.cid,c.cname) from Customer c");

 

List<Customer> allCustomer = query.list();

for (Customer customer : allCustomer) {

System.out.println(customer.getCid() + " : " + customer.getOrderSet().size());

}

 

session.getTransaction().commit();

session.close();

}

排序

@Test

public void demo03(){

//3排序 ,mysql--> select... order by 字段  [asc]|desc ,....

Session session = factory.openSession();

session.beginTransaction();

 

Query query = session.createQuery("from Customer order by cid desc");

 

List<Customer> allCustomer = query.list();

for (Customer customer : allCustomer) {

System.out.println(customer.getCid());

}

 

session.getTransaction().commit();

session.close();

}

 

分页

@Test

public void demo05(){

//分页

Session session = factory.openSession();

session.beginTransaction();

 

Query query = session.createQuery("from Customer");

// * 开始索引 , startIndex 算法: startIndex = (pageNum - 1) * pageSize;

// *** pageNum 当前页(之前的 pageCode)

query.setFirstResult(0);

// * 每页显示个数 , pageSize

query.setMaxResults(2);

 

List<Customer> allCustomer = query.list();

for (Customer customer : allCustomer) {

System.out.println(customer.getCid());

}

 

session.getTransaction().commit();

session.close();

}

绑定参数

@Test

public void demo06(){

/* 6 绑定参数

 * 方式1:占位符,使用? 在hql语句替换具体参数

 * 设置参数 query.setXxx(int , object)

 * 参数1:?位置,从0开始。

 * 参数2:实际参数

 * 例如:String --> query.setString(int,String)

 * 方式2:别名 , 格式 “属性= :别名 ”

 * 设置参数 query.setXxx(String,object)

 * 参数1:别名

 * 参数2:实际参数

 * 例如:Integer --> query.setInteger(String,Integer)

 * 提供公共设置方法

 * setParameter(int|string , Object)

 */

Session session = factory.openSession();

session.beginTransaction();

 

Integer cid = 1;

 

//方式1

// Query query = session.createQuery("from Customer where cid = ?");

// query.setInteger(0, cid);

//方式2

Query query = session.createQuery("from Customer where cid = :xxx");

// query.setInteger("xxx", cid);

query.setParameter("xxx", cid);

 

Customer customer = (Customer) query.uniqueResult();

System.out.println(customer);

 

session.getTransaction().commit();

session.close();

}

 

聚合函数和分组

@Test

public void demo07(){

/* 7  聚合函数

 */

Session session = factory.openSession();

session.beginTransaction();

 

//1

// Query query = session.createQuery("select count(*) from Customer");

//2 别名

// Query query = session.createQuery("select count(c) from Customer c");

//3 oid

Query query = session.createQuery("select count(cid) from Customer");

 

Long numLong = (Long) query.uniqueResult();

int num = numLong.intValue();

 

System.out.println(num);

 

 

session.getTransaction().commit();

session.close();

}

连接查询

 

1.交叉连接 ,等效 sql 笛卡尔积

2.隐式内连接,等效 sql 隐式内连接

3.内连接,等效sql内连接

4.迫切内连接,hibernate底层使用 内连接。

5.左外连接,等效sql左外连接

6.迫切左外连接,hibernate底层使用 左外连接

7.右外连接,等效sql右外连接

 

内连接和迫切内连接?

左外连接和迫切左外连接?

@Test

public void demo08(){

/* 8 链接查询 : 左外连接和迫切左外连接?

 * * 左外连接 , left outer join

 * 底层使用sql的左外连接,hibernate进行数据自动封装,将一条记录,封装给两个对象(Customer,Order)

 * 将两个对象添加到一个对象数组中Object[Customer,Order]

 * * 迫切左外链接 left outer join fetch

 * 底层使用sql的左外连接,hibernate将一条记录封装给Customer,讲order数据封装Order,并将order关联到Customer

 * customer.getOrderSet().add(order)

 * 默认查询的数据重复

 */

Session session = factory.openSession();

session.beginTransaction();

 

//左外连接

// List list = session.createQuery("from Customer c left outer join c.orderSet ").list();

//迫切左外链接 (默认数据重复)

// List list = session.createQuery("from Customer c left outer join fetch c.orderSet ").list();

//迫切左外链接 (去重复)

List list = session.createQuery("select distinct c from Customer c left outer join fetch c.orderSet ").list();

 

 

session.getTransaction().commit();

session.close();

}

命名查询

  1. 思想:将HQL从java源码中,提取到配置文件中。
  2. 分类:全局、布局
  3. 配置

全局:*.hbm.xml   <class></class><query name="名称">HQL语句

局部: <class name="" table=""><id><property> <query name="">HQL</class>

  1. 获得

全局:

session.getNamedQuery("queryName")

局部:

session.getNamedQuery("className.queryName")  需要使用类的全限定名称

 

@Test

public void demo09(){

/* 9 命名查询

 */

Session session = factory.openSession();

session.beginTransaction();

 

//全局

//List list = session.getNamedQuery("findAll").list();

//局部

List list = session.getNamedQuery("com.itheima.a_init.Customer.findAll").list();

 

System.out.println(list.size());

 

session.getTransaction().commit();

session.close();

}

 

      1.4、QBC检索方式

 

QBC查询:

QBC:Query By Criteria条件查询.面向对象的查询的方式.

 

QBC简单的查询:

// 简单查询:

List<Customer> list = session.createCriteria(Customer.class).list();

for (Customer customer : list) {

System.out.println(customer);

}

QBC分页的查询:

Criteria criteria = session.createCriteria(Order.class);

criteria.setFirstResult(10);

criteria.setMaxResults(10);

List<Order> list = criteria.list();

QBC排序查询:

Criteria criteria = session.createCriteria(Customer.class);

// criteria.addOrder(org.hibernate.criterion.Order.asc("age"));

criteria.addOrder(org.hibernate.criterion.Order.desc("age"));

List<Customer> list = criteria.list();

QBC条件查询:

// 按名称查询:

/*Criteria criteria = session.createCriteria(Customer.class);

criteria.add(Restrictions.eq("cname", "tom"));

List<Customer> list = criteria.list();*/

 

// 模糊查询;

/*Criteria criteria = session.createCriteria(Customer.class);

criteria.add(Restrictions.like("cname", "t%"));

List<Customer> list = criteria.list();*/

 

// 条件并列查询

Criteria criteria = session.createCriteria(Customer.class);

criteria.add(Restrictions.like("cname", "t%"));

criteria.add(Restrictions.ge("age", 35));

List<Customer> list = criteria.list();

 

 

离线查询(了解)

  1. DetachedCriteria 离线查询对象,不需要使用Session就可以拼凑查询条件。一般使用在web层或service层拼凑。将此对象传递给dao层,此时将与session进行绑定执行查询。
  2. 离线查询条件与QBC一样的。

 

@Test

public void demo10(){

/* 10 离线查询

 */

 

//web & service

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);

detachedCriteria.add(Restrictions.eq("cid", 1));

 

//---------------dao

 

Session session = factory.openSession();

session.beginTransaction();

 

// 离线Criteria 与session绑定

Criteria criteria = detachedCriteria.getExecutableCriteria(session);

List<Customer> allCustomer = criteria.list();

System.out.println(allCustomer.size());

 

session.getTransaction().commit();

session.close();

}

 

      1.5、SQL检索方式

                                    使用本地数据库的SQL查询语句。

@Test

public void demo11(){

//使用的就是数据库表名了。
        SQLQuery SQLquery = session.createSQLQuery("select * from staff");
        //返回的是一个List<Object[]> 只有通过addEntity。来绑定实体。
        List<Staff> list = SQLquery.addEntity(Staff.class).list();
        System.out.println(list.get(0).getName());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值