hql和criteria

Hql:

在查询多个对象的时候:"select e.empName,d.depName from Emp e , Dep d where e.depId = d.depId "; 需要用list<Object[]>来接收,如果只有一条记录,那么就是用object[] 来接收

 ·query对象的几个重要的方法

query.setFirstResult( n ) , query.setMaxResults( n ) , query.uniqueResult(); query.list(); 

query.setParameter("name",value);

-------------

        String hql = "from Emp e where e.id =:idname";

Query query = session.createQuery(hql);

query.setParameter("idname", 1);

query.uniqueResult();

-------------

session.get(Emp.class, 1);/session.load()

下面的方法效率更好,因为get或者load可以从缓存中取

插叙记录总数:

Query query = session.createQuery("select count(*) from Emp");

query.iterate().next();

Criteria(Query有的方法,它大部分都有)

· 排序://首先要明确是哪个对的查询

Criteria criteria = session.createCriteria(类名.class);

criteria.addOrder(Order.desc("要排序的属性名"));

·连接查询:criteria.setFetchMode("dep", FetchMode.JOIN); //这里的fetchMode跟懒加载里面的fetch = select,join一样的

criteria.setFirstResultn),criteria.setMaxResultsn)这些方法criteria都有

·Criteria加条件:criteria.add(Restriction.eq("", value));

离线查询

DetachedCriteria(离线查询)

因为detachedCriteria是可以在session之外创建的,不想Criteria那样,要依赖session来创建,在其他层来创建,比如说service层,

DAO层:

//多条件查询

public List queryBatch(DetachedCriteria dc){//分离条件查询

Session session = HibernateUtil.getSession();//得到session

Criteria c = dc.getExecutableCriteria(session);

return c.list();

}

Service层:

//从页面,或者action接收的条件集合,有很多个,用list接收

public List getRequest(Map<String, Object> terms){  

//对于某个类来进行离线查询

DetachedCriteria dc = DetachedCriteria.forClass(Emp.class);for (Entry<String , Object> en : terms.entrySet()) {

if(en.getKey().equals("empName") && en.getValue() != null){

dc.add(Restrictions.eq(en.getKey(), en.getValue()));

}else if(en.getKey().equals("dep")){

.....

}

}

return queryBatch(dc);

}

N+1次查询

·Query.iterator()的查询会出现N+1的查询 (通过二级缓存来解决)

·懒加载的关联查询也会出现N+!查询 (通过join  fetch来解决)

·对打开的查询缓存及使用了List也会出现N+1

本地sql查询:

Query sqlQuery = session.createSQLQuery("select * from emp");

如果是这样的语句的话那么就要用list<Object[]>来接收 

List<Object[]> objs = sqlQuery.list();

可以这样写,使得得到的是一个对象:

Query sqlQuery = session.createSQLQuery("select {e.*} from emp e").addEntity("e", Emp.class);

List<Emp> empLIst = sqlQuery.list();

命名查询:

hqlsql语句写到配置文件中去,然后在通过配置文件中的名字来查询,这样可以有助于以后的修改

<class name="Emp" table="emp">

<id name="empId" column="emp_id">

<generator class="hilo"/>

</id>

<property name="empName" column="emp_name"/>

<many-to-one name="dep" column="dep_id" ></many-to-one>

<!--<query name="selectAllEmp">

<![CDATA[from Emp]]>

</query>-->

</class>

<!--下面的查询语句也可以写到<class>里面,但是在用的时候需要通过包名.类名来访问-->

<query name="selectAllEmp">

<![CDATA[from Emp]]> <!--这里要注意一下-->

</query>

在类中这样写:

Query sqlQuery = session.getNamedQuery("selectAllEmp");

如果是把<query ></query>写在<class></class>里面,那么就需要这样写,以上例为例:

Query sqlQuery = session.getNamedQuery("hwt.pojo.Emp.selectAllEmp");

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值