Query接口使用和说明
- 格式:pdf
- 大小:245.94 KB
- 文档页数:4
一、Query,是查询的意思,为了在数据库中寻找某一特定文件、网站、记录或一系列记
录,由搜索引擎或数据库送出的消息。
二、Query 在hibernate中的应用: Query 是hibernate提供的查询的一种方式, 这种方式会直接取查表而不是从缓存中查, 除非
你在query查询之前手动设置从缓存中查 Query有两个 一个是hibernate 原生的,一个是hibernate 对JTA 的 实现,都是用来查询
用的 Query是hibernate查询数据库用到的一个方法;在hibernate中,我们可以通过Query类的方法来得到各种不同的查询数据结果; Query可以参数化hql语句分页的时候会用到Query一般find能处理的就用find了
三、hibernate中Query的用法 通过SessionFactory获得了session对象后,除了可以通过get(类名.class, id)方法得到相应
的对象,还可以通过获得Query对象来取得需要的对象 Query query = session.createQuery("查询语句如from UserBean");
List list = query.list();//得到一个集合
也可以用query.uniqueResult();//得到一个单个的对象 分页查询:
query.setFirstResult(位置如0);//表示从哪个位置开始查询,返回query对象 query.setMaxResult(记录条数);//表示当页共几条记录,返回一个集合
session.createQuery("select count(*) from 类名").uniqueResult();//得到记录总数
查询语句同sql查询语句很想象,只是将表名换作类名,字段名换作属性名,如果查询需
要条件可以使用占位符来替换对应的属性名,也可以使用:变量名来作为占位符。
一个分页查询: public QueryResult list(final Class clazz, final int index, final int count,
final String wherehql, final Object[] params,final Map orderby) {
final QueryResult qr = new QueryResult();
hibernateTemplate.executeFind(new HibernateCallback() {
@Override public T doInHibernate(Session session) throws HibernateException,
SQLException {
Query query = session.createQuery(
"from " + getEntityName(clazz) + " o " + (StringUtils.isBlank(wherehql) ? "": "where "+
wherehql) + buildOrderby(orderby));
setQueryParams(query, params);
if(index != -1 && count != -1){
query.setFirstResult(index);
query.setMaxResults(count); }
List list = query.list();
qr.setRecords(list);
query = session.createQuery(
"select count(*) from " + getEntityName(clazz) + " o " + (StringUtils.isBlank(wherehql) ? "": "where "+ wherehql));
setQueryParams(query, params);
long totalrecord = 0;
Object total = query.uniqueResult(); if(total != null){
totalrecord = Long.valueOf(total.toString());
}
qr.setTotalCount(totalrecord);
return (T) list; }
});
return qr;
}
/** * 给hql语句中的where子句中的参数赋值
* @param query
* @param queryParams
*/ protected void setQueryParams(Query query, Object[] queryParams){
if(queryParams!=null && queryParams.length>0){
for(int i=0; i
query.setParameter(i, queryParams[i]);
} }
}
/** * 创建hql语句的order by子句
* @param orderby * @return
*/
protected String buildOrderby(Map orderby){
StringBuffer orderbyql = new StringBuffer("");
if(orderby!=null && orderby.size()>0){ orderbyql.append(" order by ");
for(String key : orderby.keySet()){
orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbyql.deleteCharAt(orderbyql.length()-1); }
return orderbyql.toString();
} 四、Hibernate中的Query接口学习
在Hibernate 2.x中,可以用find()方法来执行HQL语句,但是在Hibernate3.x中却用Query接口来取代了find()方法,提供了更加强大的功能。
下面简要的看一下它的用法:
1 可以使用“?”来设定参数。要严格的顺序
2 使用“:”后跟变量来设置参数。没有严格的顺序 3 参数绑定
4 setEntity()方法把参数和一个持久化类的实例来绑定
5 setParameter()方法
6 setPropertyies()方法
7 使用命名查询,通过在.hbm.xml中使用query标签,编写查询语句。 8 list()方法,该方法用于取得查询结果Lit结合。
9 iterator()该方法用于这样调价的查询,我们查询一大堆的记录,这里记录可能有的在缓
存中,有的可能在数据库中,对于已经在缓存中的我们就不要再想数据库中做查询了,这
里就可以使用iterator()方法。
10 缓存查询。缓存查询的配置,添加property标签于session-factory标签下,name属性设为“hibernate.cache.use_query_cache”,值设为true.然后在每次建立Query后,执行一
下setCacheable(true)方法。
五、介绍一些有关Query的查询语句:
查询数据个数:
(Integer)session.createQuery("select count(*) from User").iterate().next(); 使用HQL删除数据:
String hql = "delete user where age>18";
Query query = session.createQuery(hql);
int ref = query.executeUpdate();
tran.commit(); //更新数据
Transaction tx= session.beginTransaction();
Query query = session.createQuery("update User set name='momor' where name='bbb'");
query.executeUpdate();
tx.commit(); session.close(); 也可以在where子句上进行表达式,例如:
Query query = session.createQuery("from User user where (user.age / 10 = 3)"); 也可以在where子句上使用and、or,例如:
Query query = session.createQuery("from User user where (user.age > 20) and (user.name = 'caterpillar')"); is not nullL与is null则可以测试字段值是否为空值,例如:
Query query = session.createQuery("from User user where user.name is not null"); between可以测试字段值是否在指定的范围之内,例如:
Query query = session.createQuery("from User user where user.age between 20 and 30"); 可以使用in或not in来测试字段值是否在您指定的集合中,例如:
Query query = session.createQuery("from User user where user.name in('caterpillar', 'momor')"); like或not like可以让您进行模糊条件搜寻,例如想搜寻名称中含有cater开头的数据:
Query query = session.createQuery("from User user where user.name like 'cater%'"); 可以对查询结果使用order by进行排序: Query query = session.createQuery("from User user order by user.age");