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. Web架构之Nginx基础配置

    目录 1.Nginx 虚拟主机 1.1.基于域名的虚拟主机 1.2.基于端口的虚拟主机 1.3.基于IP的虚拟主机 2.Nginx include 3.Nginx 日志配置 3.1.访问日志 3.2. ...

  2. Python卸载

    前言 自己瞎折腾下载Python3.8.2,把之前下载好的python3.7.3覆盖掉.在运行之前Python环境的程序多次未果后.找到原因,Python3.7.3的包不支持Python3.8.2.于 ...

  3. Drf(DjangoRestFramewok)

    第一部分 问题 1.前后端分离? vue.js 后端给前段返回json数据 2.移动端盛行. app 后端给app返回json数据 3.PC端应用? crm项目,前段后端一起写,运行在浏览器上. 一般 ...

  4. Vue2.0 【第二季】第3节 Vue.set全局操作

    目录 Vue2.0 [第二季]第3节 Vue.set全局操作 第3节:Vue.set全局操作 一.引用构造器外部数据 二.在外部改变数据的三种方法: 三.为什么要有Vue.set的存在? Vue2.0 ...

  5. Natas9 Writeup(命令注入)

    Natas9: 审计源码,发现关键代码: $key = ""; if(array_key_exists("needle", $_REQUEST)) { $key ...

  6. github的上面的安全工具

    简介 Scanners Box也被称为 scanbox,是一个强大完备的黑客工具箱,它收集了Github上数10种类别的开源扫描器,包括子域名,数据库,中间件和其他模块化设计的扫描器等,但对于一些被大 ...

  7. Flutter 学习路线图

    Flutter 学习路线图 如果你真的觉得很难,坚持不了了,那就放弃,既然放弃了就不要抱怨没有得到. 选择你热爱的,坚持你选择的,不抱怨放弃的. 前言 Flutter越来越火,学习Flutter的人越 ...

  8. Cisco 综合配置(一)

    要求: 1.内网所有PC及服务器都能访问外网 2.外网通过公网地址 202.101.100.3 访问内网服务器的Telnet服务 配置: PC.服务器都配置好自己的IP和默认网关:192.168.1. ...

  9. CBV和APIView源码分析

    CBV源码分析 查看源码的方式,先查看自身,没有去找父类,父类没有就去找父父类... 自己定义的类 class Author(View): def get(self,request): back_di ...

  10. 文本编辑器之kindeditor

    摘要:最近在自己学习搭建网站的时候,突然要搭建网站的时候发现了一个好东西,那就是kindeditor这个文本编辑器,这个编辑器简单好用,而且很小,并且是开源的. 文本编辑器介绍 KindEditor ...