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.setFirstResult(n),criteria.setMaxResults(n)这些方法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();
命名查询:
把hql和sql语句写到配置文件中去,然后在通过配置文件中的名字来查询,这样可以有助于以后的修改
<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");