Hibernate中的查询

大家都很清楚,要完成数据持久化就需要使用jdbc或者要使用orm
大家都很清楚JDBC中使用sql语句的查询方式,那么Hibernate应该如何查询呢?
今天来介绍ORM的Hibernate框架中查询如何使用
Hibernate框架有5种查询方式
下面是基础操作
获取Session和事务对象

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tran = session.beginTransaction();
  1. OID查询(依据主键)
User user2 = session.get(User.class,new Integer(1));

这里的第二个参数就是主键的id
通过session的get方法来加载

  1. 对象导航检索
    (1)Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式
    (2)这种方式暂未使用过

  2. HQL检索(不支持代替所有列)
    Hibernate Query Language:一种面向对象的方式的查询语言,语法类似SQL,通过session.createQuery(hql语句)
    ①简单查询
    from 类名 [别名]:查询该类对应表中所有数据
    或 select 别名 from 类名 别名
    ②排序查询(默认升序)
    from 类名 order by 属性名 排序方式
    升序:asc 降序:desc
    ③条件查询(可使用占位符)
    按位置绑定:from 类名 where 属性=? [and]
    使用位置设置参数
    按名称绑定:from 类名 where 属性= :名称 [and]
    使用名称设置参数
    ④投影查询
    查询对象的某个或某些属性
    单个:select 别名.属性 from 类 别名 //list()返回List
    多个:select 别名.属性,别名.属性 from 类 别名//list()返回List<Object[]>
    若想将属性封装到对象中:select new 类名(属性名,属性名) from 类名//list()返回List<类>
    ⑤分页查询
    使用方法:query.setFirstResult(int)和.setMaxResults(int)设置分页查询
    ⑥分组统计查询
    select count(
    ) from 类名
    可使用list()取索引为0,或uniqueResult()取唯一值
    聚合函数:count()、avg()、max()、min()、sum()
    分组:select 属性名,count() from 类名 group by 属性名 [Having count()>num]//list()返回List<Object[]>
    ⑦内连接多表查询
    普通内连接:from 类名 别名 inner join 别名.属性名(该属性为外键绑定)//List<Object[]>
    迫切内连接:inner join后添加fetch //通知hibernate 将另一个对象封装到该对象的所对应的引用属性中

	//HQL检索方式,不支持*代替所有列
	//其中这里的from后面跟的必须是实体类的名字
	//接上where子句就是查询指定的,不接where就会查询出所有的信息
	Query query = session.createQuery("from User where userId = ?");
	//索引的下标是从0开始的
	query.setInteger(0, 3);
	List<User> list = query.list();
	for(User u1:list) {
		System.out.println(u1.getUsername());
	}
  1. QBC(推荐在条件转换查询时使用)
    这种方式暂未使用过
    (1)Query By Criteria:是一种更加面向对象化的查询方式,通过session.createCriteria(类.class)获取Criteria对象
    (2)①简单查询
    criteria.list()
    (3)②排序查询
    .addOrder(Order.asc(“属性名”)//升序
    .addOrder(Order.desc(“属性名”)//降序
    (4)③分页
    .setFirstResult()//设置开始索引
    .setMaxResults()//设置显示数
    (5)④条件查询
    .add(Restrictions.类型(“key”,“value”))
    类型对应:= eq、> get、>= ge、< lt、<= le、<> ne、like、in、and、or
    Ps:默认多条件为and,可使用.add(Restrictions.or(Restrictions.类型(“key”,“value”)))来使用or
    (6)⑤统计查询
    .setProjection(Projections.类型)
    类型对应:聚合函数及group by having
    (7)⑥使用DetachedCriteria(脱离session使用)离线
    在Web层使用DetachedCriteria建立对象dc(通过DetachedCriteria.forClass(类.class)设置查询类型并获取对象)
    根据业务逻辑判断所查询的条件,并使用dc.add(Restrictions.类型(“key”,“value”))设置条件
    然后通过service层传递到dao层和session进行绑定:Criteria cr = dc.getExecutableCriteria(session)

  2. SQL查询
    (1)直接使用SQL语句传输到底层进行操作
    /**

    • SQL直接使用SQL语句传输到底层进行数据的操纵
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
//sqlQuery直接转换的是Object类型,而且是无法强转的数据类型
//这时候的解决办法,在.list前使用addEntity(类) 这句话的含义就是将其换为什么样的数据类型
List<User> listUser =sqlQuery.addEntity(User.class).list();
System.out.println(listUser.size());
for(User u1:listUser) {
		System.out.println(u1.getUsername());
}

恭喜你今天又学习到了知识哟!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值