Hibernate

hibernate实现limit效果

  • 由于hql语句内无法直接书写limit语法,所以需要通过别的方式来达成这个效果
  • limit效果一般需要有两个参数:开始位置start和查询数量num。两个参数都是final int型
  • 实现代码如下:
try {
//首先新建一个final型的hql语句
final String hql="from xxb where xx="+xx+" order by xx asc ";
//hibernate执行查找,参数为请求返回方法
List<xx> xxList=getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session){
//创建查找对象 ,设置起始位置以及查询数量
Query query=session.createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(num);
//转换为list形式
return query.list();
}
});
return xxList;
}catch (RuntimeException e){
throw e;
}
  • 对于实现过程中的两个相关方法,截取其源码贴在下方,也可以自行查看。

    • executeFind方法实现如下:
public List executeFind(HibernateCallback<?> action) throws DataAccessException {
Object result = this.doExecute(action, false, false);
if (result != null && !(result instanceof List)) {
throw new InvalidDataAccessApiUsageException("Result object returned from HibernateCallback isn't a List: [" + result + "]");
} else {
return (List)result;
}
}
  • doInHibernate方法实现如下:
    public List<T> doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(this.hql).setFirstResult(this.pageModel.getBeginIndex()).setMaxResults(this.pageModel.getPageSize());
if (!CollectionUtil.listIsNull(this.params)) {
for(int i = 0; i < this.params.size(); ++i) {
Object obj = this.params.get(i);
if (obj instanceof String) {
query.setString(i, (String)obj);
} else if (obj instanceof Integer) {
query.setInteger(i, (Integer)obj);
} else if (obj instanceof Date) {
query.setDate(i, (Date)obj);
}
}
} List<T> list = query.list();
String counthql = "select count(*) " + this.hql;
Query countQuery = session.createQuery(counthql);
if (!CollectionUtil.listIsNull(this.params)) {
for(int i = 0; i < this.params.size(); ++i) {
Object obj = this.params.get(i);
if (obj instanceof String) {
countQuery.setString(i, (String)obj);
} else if (obj instanceof Integer) {
countQuery.setInteger(i, (Integer)obj);
} else if (obj instanceof Date) {
countQuery.setDate(i, (Date)obj);
}
}
} List<Object> countList = countQuery.list();
if (CollectionUtil.listIsNull(countList)) {
this.pageModel.setTotalCount(0L);
} else {
this.pageModel.setTotalCount((Long)countList.get(0));
} return list;
}

Hibernate实现limit语句效果的更多相关文章

  1. Hibernate常用查询语句

    Hibernate常用查询语句 Hib的检索方式1'导航对象图检索方式.通过已经加载的对象,调用.iterator()方法可以得到order对象如果是首次执行此方法,Hib会从数据库加载关联的orde ...

  2. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

  3. 在hibernate中用sql语句

    在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.adden ...

  4. Hibernate执行sql语句

    Hibernate执行sql语句:BasicServiceImpl basicServiceImpl = new BasicServiceImpl();String hql = "selec ...

  5. Hibernate HQL查询语句总结

    Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";L ...

  6. hibernate HQL添加语句

    1.Hibernate HQL添加语句 save();方法使用HQL语句来完成插入操作是不能实现的,不管你使用insert into....values...还是insert into.....sel ...

  7. Hibernate的hql语句save,update方法不执行

    Hibernate的hql语句save,update方法不执行 可能出现的原因问题: 未进行事务管理 需要进行xml事务配置或者注解方式的事务配置

  8. mysql limit语句

    [mysql limit语句] 代码: SELECT * FROM table LIMIT 2 OFFSET 1; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. ...

  9. Hibernate 的update语句性能详解

    Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: view plaincopy to clipboardprint? p ...

随机推荐

  1. 小程序的数据存储,与Django等服务发送请求

    目录 官方文档 快速归纳 存取改删 1.wx存储数据到本地以及本地获取数 1.1 wx.setStorageSync(string key, any data) 存(同步) 1.2 wx.setSto ...

  2. 鼠年开元用逐浪CMS v8.13版-NoSQL安装更轻便

    作为国内领先的Zoomla!逐浪CMS,一直以来深受人道的除了其功能强大.性能稳定外,易用性也是其突出的现. 自Zoomla!逐浪CMS 8.x开始,官方在其程序包中,集成了一键安装进程,从而大大提升 ...

  3. 一致性hash算法之php实现

    源码地址:https://github.com/killallspree/myFrame/blob/master/framework/components/Flexihash.php

  4. jQuery插件select2跨域设置xhrFields参数

    ajax跨越时默认不带cookie,如果需要带cookie调用,需要设置参数 xhrFields: { withCredentials: true },如: $.ajax({url : "h ...

  5. drf呼啦圈

    呼啦圈 1.1 表结构设计 不会经常变化的值放在内存:choices形式,避免跨表性能低. 分表:如果表中列太多/大量内容可以选择水平分表 表自关联 from django.db import mod ...

  6. 因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知!

    因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知! volatile 是并发编程的重要组成部分,也是面试常被问到的问题之一.不要向小强那样,因为一句:volati ...

  7. 深度学习与人类语言处理-语音识别(part2)

    上节回顾深度学习与人类语言处理-语音识别(part1),这节课我们将学习如何将seq2seq模型用在语音识别 LAS 那我们来看看LAS的Encoder,Attend,Decoder分别是什么 Lis ...

  8. react 新创建项目

    1,先创建一个文件夹用于存放项目 2,运行cmd,路径选择到你创建的文件夹内 3,  npm install -g create-react-app         create-react-app ...

  9. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  10. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...