关于Hibernate学习记录

来源:互联网 发布:matlab数组分号 编辑:程序博客网 时间:2024/05/22 08:11

持久层框架Hibernate有三种查询方式:

分别是:HQL(面向对象查询)、Criteria、SQL

具体使用:

1、Criteria和DetachedCriteria :该查询采用面向对象方式封装查询条件,又称为对象查询;就是对SQL 语句进行封装,采用对象的方式来组合各种查询条件,由Hibernate 自动产生SQL 查询语句。

Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name)进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。

Criteria criteria=getCriteria();protected Criteria getCriteria() {return getSession().createCriteria(entityClass);}/** * 获取hibernate的session对象 */protected Session getSession() {return sessionFactory.getCurrentSession();}
<span style="white-space:pre"></span>DetachedCriteria subquery=DetachedCriteria.forClass(UserRole.class);<span style="white-space:pre"></span>criteria.add(Subqueries.propertyIn("id", subquery));<span style="white-space:pre"></span>return criteria.list();

  • 限制结果集内容 :一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例,org.hibernate.Criteria对SQL进行封装。Restrictions类 定义了获得某些内置Criterion类型的工厂方法,org.hibernate.criterion.Restrictions可以设定多种查询条件:
限定查询条件:
  • criteria.add(Restrictions.isNull("parentId"));// parentId为空
  • criteria.add(Restrictions.gt("age", new Integer(20)));//gt(great than):大于
  • criteria.add(Restrictions.lt("age", new Integer(40)));//lt(less than):小于
  • criteria.add(Restrictions.like("account",account,MatchMode.ANYWHERE));
  • criteria.add(Restrictions.in("account", listParams.toArray()));
  • criteria.addOrder(Order.asc("seqNum")); // 根据seqNum从小到达排序,逆序则使用desc()
限定查询结果数量:
  • criteria.setFirstResult(51);<span style="white-space:pre"></span>//  起始条
  • criteria.setMaxResults(50);<span style="white-space:pre"></span>//  条数
去除重复行:
<ul><li>criteria.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY);</li></ul>


获取结果:
  • List<User> result= criteria.list();

使用MatchMode:

MatchMode.START:字符串在最前面的位置.相当于"like 'key%'"
MatchMode.END:字符串在最后面的位置.相当于"like '%key'"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%key%'"
MatchMode.EXACT:字符串精确匹配.相当于"like 'key'"


对实体类的注解:

@ManyToOne(fetch = FetchType.EAGER)// 表示取出这条数据时,它关联的数据也同时取出放入内存中 
@JoinColumn(name = "record_id", insertable = false, updatable = false)
其中,fetch属性,设定关联对象的加载策略或方式。可选值如下:
FetchType.LAZY:懒加载,关联对象不立刻加载(即从数据库读入到内存),在使用到的时候加载。
FetchType.EAGER:立刻加载,在加载主体对象时,同时加载关联属性对象。

@Fetch(FetchMode.JOIN) hibernate自有加载策略注解。可选值如下: 
@Fetch(FetchMode.JOIN):始终立刻加载,使用外连(outer join)立刻加载关联对象,且忽略FetchType.LAZY。 
@Fetch(FetchMode.SELECT) 默认懒加载(除非设定lazy=false),在访问每一个关联对象时用Select查询加载。有n+1次查询。 
@Fetch(FetchMode.SUBSELECT) 默认懒加载(除非设定lazy=false),在第一次访问关联对象时才一次性加载所有关联对象。共产生两条sql语句,且FetchType设定有效。


2、Query

Query query=createQuery("delete xx where rId=:rId and fId in(:fId)");query.setString("rd", rId);query.setParameterList("fId", fId);query.executeUpdate();

0 0