分享

Hibernate—番外篇 I find it

 太极混元天尊 2018-04-13

很久很久以前,我们了解Hibernate框架的基本用法(Hibernate—第一季who are you)和多对多关系(Hibernate—第二季many-one-many),但使用最多的还是使用Hibernate进行增删改查。

Hibernate查询可以使用三种方式:

1、HQL语法

2、Criteria语法

3、SQL语法(和平时用的sql基本一样,就不介绍了。)

HQL语法

查询多条信息
String hql1 = ' from  com.domain.User ';//完整写法
String hql2 = ' from  User '//简单写法要确保只有一个User对象
String hql3 = ' from  com.domain.User order by user_id asc';//排序 desc
String hql4 = ' select user_name,user_id from  com.domain.User  ';//投影查询
String hql5 = ' select new User (user_id,user_name) from  com.domain.User  ';//投影查询
Query query = session.createQuery(hql);
query.setFirstResult(0);//分页起始位
query.setMaxResults(10);//分页一页显示条数  
List list = query.list();
条件查询一条信息
String hql1 = ' from  com.domain.User where user_id =? ';//完整写法
String hql2 = ' from  com.domain.User where user_id = :id ';//完整写法  
Query query = session.createQuery(hql);  
query.setParameter(01l);//对应hql1
query.setParameter('id'1l);//对应hql2
User user = (User)query.uniqueResult()
统计查询
//count计数  sum求和  avg平均数 ......
String hql1 = ' select count(*) from  com.domain.User  ';
String hql2 = ' select sum(user_id) from  com.domain.User  ';
Query query = session.createQuery(hql);  
Number number  = (Number) query.uniqueResult();
连接查询
String hql1 = ' from User u inner join u.departments ';//内连接
String hql2 = ' from User u inner join fetch u.departments ';//迫切内连接
String hql3 = ' from User u left join u.departments ';//左外连接
String hql4 = ' from User u right join u.departments ';//右外连接
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List list = query.list();//使用fetch 迫切连接 会帮我们进行封装  
for(Object[] arr : list){
 System.out.println(Arrays.toString(arr));
}

Criteria语法

Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq('user_id',1l));//添加条件
c.addOrder(Order.asc('user_id'));//排序(Order.desc())
c.setFirstResult(0);//分页起始位
c.setMaxResults(10);//分页一页显示条数
List list = c.list();
//统计 已经帮我们封装了大量统计方法 可以Projections.点看看
c.setProjection(Projections.rowCount());
Criteria语法补充:

Hibernate为我们提供了DetachedCriteria对象,使我们可以在获取参数后再web层进行查询条件封装。(离线查询)感受下代码:

//--------Service/web层------------------------------------
DetachedCriteria dc  = DetachedCriteria.forClass(User.class);  
dc.add(Restrictions.idEq(1l));//拼装条件(全部与普通Criteria一致)
//----------------------------------------------------
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//-----------dao-----------------------------------------
Criteria c = dc.getExecutableCriteria(session);
List list = c.list();
了解知识:

fetch(加载策略)和lazy(延迟加载)这两个属于Hibernate优化方面。事实上Hibernate已经帮我们使用了最优的fetch(加载策略)lazy(延迟加载)。所以感兴趣的小伙伴可以自己了解下。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多