hibernate提供5中查询的方式
1. 唯一标识OID的检索方式
session.get(对象.class,OID)
2. 对象的导航的方式
man.getCustomer().getCust_name()
3. HQL的检索方式
Hibernate Query Language-- Hibernate的查询语言
4. QBC的检索方式
Query By Criteria-- 条件查询
5. SQL检索方式(了解)
本地的SQL检索
玩hibernate框架,推荐使用HQL和QBC。
一、OID方式(用得很多)
Customer c1 = session.get(Customer.class, 1L);
二、对象的导航的方式(用得很多)
@Test
public void run1() {
// 查询1号客户
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 先使用OID的方式查询客户
Customer c1 = session.get(Customer.class, 1L);
System.out.println("=======================");
// 查看该客户下的联系人的集合
System.out.println(c1.getLinkmans().size());
tx.commit();
}
/**
* 查询联系人,属于某一个客户
*/
@Test
public void run2() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 先
Linkman man = session.get(Linkman.class, 1L);
System.out.println("=======================");
System.out.println(man.getCustomer().getCust_name());
tx.commit();
}
三. HQL的检索方式(用得比较多)
1. HQL的介绍HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似
在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式
2. HQL与SQL的关系
HQL 查询语句是面向对象的,Hibernate负责解析HQL查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句.
HQL 查询语句中的主体是域模型中的类及类的属性
SQL 查询语句是与关系数据库绑定在一起的. SQL查询语句中的主体是数据库表及表的字段
3.1 基本的演示
@Test
public void run1() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 创建hql查询接口
Query query = session.createQuery(" from Customer ");
// 调用list()方法,查询
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
3.2 支持方法链的编程风格
@Test
public void run2() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
List<Customer> list = session.createQuery(" from Customer ").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
3.3 别名的方式
@Test
public void run3() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 这种写法是会报错的,不能出现*
// List<Customer> list = session.createQuery(" select * from
// Customer").list();
// 别名好处在于,引用属性。形如:c.name, c.age
List<Customer> list = session.createQuery(" select c from Customer c ").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
3.4 排序查询
SQL: order by 字段asc/desc;
HQL:关键字是一样的,order by属性
@Test
public void run4() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
List<Linkman> list = session.createQuery(" from Linkman l order by l.lkm_id desc ").list();
for (Linkman man : list) {
System.out.println(man);
}
tx.commit();
}
3.5 分页查询
* Hibernate框架提供了分页的方法,咱们可以调用方法来完成分页
* 两个方法如下
* setFirstResult(a)-- 从哪条记录开始,如果查询是从第一条开启,值是0
* setMaxResults(b)-- 每页查询的记录条数
@Test
public void run5() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery(" from Linkman ");
// 分页查询,调用方法,查询第一页的数据1-3条
/*query.setFirstResult(0);
query.setMaxResults(3);*/
// 查询第二页的数据
query.setFirstResult(3);//(当前页-1)*size
query.setMaxResults(3);
List<Linkman> list = query.list();
for (Linkman man : list) {
System.out.println(man);
}
tx.commit();
}
3.6 带条件的查询
* setParameter("?号的位置,默认从0开始","参数的值"); 不用考虑参数的具体类型
* 按位置绑定参数的条件查询(指定下标值,默认从0开始)
* 按名称绑定参数的条件查询(HQL语句中的 ? 号换成 :名称 的方式)
@Test
public void run6() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 方式一
/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = ? ");
query.setString(0, "male");*/
// 方式二
/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = :gender ");
query.setString("gender", "male");*/
// 方式三
/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = ? ");
query.setParameter(0, "male");*/
// 方式四
Query query = session.createQuery(" from Linkman l where l.lkm_gender = :gender ");
query.setParameter("gender", "male");
List<Linkman> list = query.list();
for (Linkman man : list) {
System.out.println(man);
}
tx.commit();
}
3.7 投影查询
" from Linkman "
如上,默认情况下,查询所有,hibernate调用空的构造方法,会查询所有字段。
如果要查询某几个字段有如下方法:
/**
* 只查几个字段
*/
@Test
public void run7() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 按字段查询
Query query = session.createQuery(" select lkm_name, lkm_gender from Linkman ");
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
}
如上,它返回的是Object类型。如果要返回Linkman类型怎么办?来看投影查询
/**
* 投影查询:只查几个字段
* 第一步:需要在javabean中提供对应字段的构造方法
* 第二步:hql语句发生变化
* 注意:空的构造方法一定要有的
*/
@Test
public void run8() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 默认情况下,查询所有,hibernate调用空的构造方法
Query query = session.createQuery(" select new Linkman(lkm_name, lkm_gender) from Linkman ");
List<Linkman> list = query.list();
for (Linkman man : list) {
System.out.println(man);
}
tx.commit();
}
3.8 聚合函数
3.8.1 count
/**
* 聚合函数:count()
*/
@Test
public void run9() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 查询所有联系人的数量
List<Number> list = session.createQuery(" select count(linkman) from Linkman linkman ").list();
// List<Number> list = session.createQuery(" select count(*) from Linkman ").list();
// 通过下标值去取值
Long count = list.get(0).longValue();
System.out.println("数量:" + count);
tx.commit();
}
3.8.2 sum
/**
* 聚合函数:sum() avg() max() min()
*/
@Test
public void run10() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 查询所有联系人的数量
List<Number> list = session.createQuery(" select sum(lkm_id) from Linkman ").list();
// 通过下标值去取值
Long count = list.get(0).longValue();
System.out.println("数量:" + count);
tx.commit();
}