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. requests.exceptions.SSLError报错

    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries excee ...

  2. 解决idea的pom.xml文件不自动导包问题

      在用pom添加新项目的包时,突然发现pom文件不能自动导包,找了半天发现用以下两个步骤就能解决: 一:打开setting 二:找到maven

  3. 学习ConcurrentHashMap1.7分段锁原理

    1. 概述 接上一篇 学习 ConcurrentHashMap1.8 并发写机制, 本文主要学习 Segment分段锁 的实现原理. 虽然 JDK1.7 在生产环境已逐渐被 JDK1.8 替代,然而一 ...

  4. markdown从入门到放弃word和PDF

    Markdown是一个「轻量级」的「标记语言」. 淡定!!!我知道很多"编外人员"看到这句话之后已经没有兴趣再看下去了. 但是请不要关掉这个页面!!! Markdown很简单!!! ...

  5. 【牛客】乃爱与城市拥挤程度 — 树形dp,up and down

    我太难了 这题做得我要死了,来来回回写了大概八九个小时 错误的原因要么是快速幂写错(一生之敌,要么是忘取模爆\(longlong\)变负数\(QAQ\) \(update\) \(2019.11.13 ...

  6. 基于Python3 + appium的Ui自动化测试框架

    UiAutoTest 一.概要 数据驱动的Ui自动化框架 二.环境要求 框架基于Python3 + unittest + appium 运行电脑需配置adb.aapt的环境变量,build_tools ...

  7. asp.net里获取或设置textarea/asp:Textbox/dropdownlist/CheckBox 的值

    1.   textarea .asp:label 和 tasp:extbox 的text文本值: <textarea id="txt_remark" runat=" ...

  8. tomcat启动时间5分钟左右org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.

    org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance ...

  9. spring boot devtools热部署

    问题1: Springloaded 在springboot2的maven的pom.xml 无法找到 解决方法:在idea通过View->Tool Windows->Maven Projec ...

  10. NIO的原理和文件读入读出及图片拷贝的使用

    1.NIO的简介        java.nio 全称 java non-blocking IO 是jdk1.4之后出现的 New IO        为所有的原始类型(boolean除外)提供了缓存 ...