大家都很清楚,要完成数据持久化就需要使用jdbc或者要使用orm
大家都很清楚JDBC中使用sql语句的查询方式,那么Hibernate应该如何查询呢?
今天来介绍ORM的Hibernate框架中查询如何使用
Hibernate框架有5种查询方式
下面是基础操作
获取Session和事务对象
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tran = session.beginTransaction();
- OID查询(依据主键)
User user2 = session.get(User.class,new Integer(1));
这里的第二个参数就是主键的id
通过session的get方法来加载
-
对象导航检索
(1)Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式
(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());
}
-
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) -
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());
}
恭喜你今天又学习到了知识哟!!!