package com.redbaby.dao;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javacommon.xsqlbuilder.XsqlBuilder;
import javacommon.xsqlbuilder.XsqlBuilder.XsqlFilterResult;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.redbaby.util.Page;
public abstract class HibernateGenericDao extends HibernateDaoSupport {
/**
* 得到一条数据(整个Object 对象)
*
* hql: from Object where .....
*
* @param hql
* @param values
* @return
* @throws DataAccessException
*/
public Object getInfo(String hql, Object... values) throws DataAccessException {
List list = null;
list = super.getHibernateTemplate().find(hql, values);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
/**
* 得到对象Object 某一个属性 select 中 必选指定要查询 字段名称(一个)
*
* hql: select p.id from object where 1=1 .....
*/
public Object getInfoParam(final String hql, Object... values) throws DataAccessException {
Session session = super.getSession();
Query query = session.createQuery(hql);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
Object obj = query.uniqueResult();
return obj;
}
/**
* 得到 List
*
* @param hql
* @param values
* @return
* @throws DataAccessDataAccessException
*/
public List<?> getListByParam(String hql, Object... values) throws DataAccessException {
return super.getHibernateTemplate().find(hql, values);
}
/**
* 执行 带参数的 DML UPDATE DELETE
*
* @param hql
* @param values
* @return
* @throws DataAccessDataAccessException
*/
public void updateForParam(final String hql, final Object... values) throws DataAccessException {
super.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(hql);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return query.executeUpdate();
}
});
}
/**
* HQL分页(带查询)
*
* @param hql
* @param params
* @param page
* @return
* @throws DataAccessDataAccessException
*/
public List<?> getListPage(String hql, Map<Object, Object> params, Page page) throws DataAccessException {
if (params == null) {
params = new HashMap<Object, Object>();
}
int first = 0;
int max = 0;
if (null != page) {
first = (int) ((page.getCurrentPage() - 1) * page.getPageSize());
max = (int) page.getPageSize();
}
final int firstResult = first;
final int maxResults = max;
XsqlFilterResult result = new XsqlBuilder().generateHql(hql, params);
Long count = getTotalCount(result.getXsql(), 1);
if (page != null) {
page.setTotalSize(count);
}
final Page pageFin = page;
final String newHql = result.getXsql();
return super.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(newHql);
if (pageFin != null) {
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
}
return query.list();
}
});
}
/**
* SQL分页查询
*/
public List<?> getListPageSQL(String sql, Map<Object, Object> params, Page page, Class<?> tclass) throws DataAccessException {
XsqlFilterResult result = new XsqlBuilder().generateHql(sql, params);
if (page != null) {
Long count = getTotalCount(result.getXsql(), 2);
page.setTotalSize(count); //
}
Session session = super.getSession();
Query queryList = session.createSQLQuery(result.getXsql()).addEntity(tclass);
if (page != null) {
queryList.setFirstResult((int) ((page.getCurrentPage() - 1) * page.getPageSize())); //
queryList.setMaxResults((int) page.getPageSize()); //
}
List<?> tList = queryList.list();
return (List<?>) tList;
}
// 返回总记录数
public long getTotalCount(String hql, long num) {
long count = 0;
int sql_from = hql.toLowerCase().indexOf("from");
int sql_orderby = hql.toLowerCase().indexOf("order by");
String countStr = "";
if (sql_orderby > 0) {
countStr = "select count(*) " + hql.substring(sql_from, sql_orderby);
} else {
countStr = "select count(*) " + hql.substring(sql_from);
}
Session session = super.getSession();
if (num == 1) {// 1,HQL查询
Query query = session.createQuery(countStr);
count = (Long) query.uniqueResult();
} else if (num == 2) {// 2,SQL查询
count = ((BigDecimal) (session.createSQLQuery(countStr)).uniqueResult()).longValue(); //
}
return count;
}
/**
* 通过sql查询Object... values形式且无分页
*
* @param sql
* @param tclass
* @param values
* @return
* @throws DataAccessException
*/
public List<?> getListByParamSQL(String sql, Class<?> tclass, Object... values) throws DataAccessException {
Session session = super.getSession();
Query queryList = session.createSQLQuery(sql).addEntity(tclass);
if (values != null) {
for (int i = 0; i < values.length; i++) {
queryList.setParameter(i, values[i]);
}
}
List<?> tList = queryList.list();
return (List<?>) tList;
}
/**
* 通过sql查询params形式且无分页
*
* @param hql
* @param params
* @return
* @throws DataAccessException
*/
public List<?> getListByParam(String hql, Map<Object, Object> params) throws DataAccessException {
if (params == null) {
params = new HashMap<Object, Object>();
}
XsqlFilterResult result = new XsqlBuilder().generateHql(hql, params);
final String newHql = result.getXsql();
return super.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(newHql);
return query.list();
}
});
}
/**
* 无分页,无所属类的SQL查询
*/
public List<Map> getListMapBySQL(String sql, Map<Object, Object> params) throws DataAccessException {
XsqlFilterResult result = new XsqlBuilder().generateHql(sql, params);
Session session = super.getSession();
Query queryList = session.createSQLQuery(result.getXsql());
List<Map> tListMap = queryList.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
return tListMap;
}
/**
* 有分页,无所属类的SQL查询
*/
public List<Map> getListMapByPageSQL(String sql, Map<Object, Object> params, Page page) throws DataAccessException {
XsqlFilterResult result = new XsqlBuilder().generateHql(sql, params);
if (page != null) {
Long count = getTotalCount(result.getXsql(), 2);
page.setTotalSize(count); //
}
Session session = super.getSession();
Query queryList = session.createSQLQuery(result.getXsql());
if (page != null) {
queryList.setFirstResult((int) ((page.getCurrentPage() - 1) * page.getPageSize())); //
queryList.setMaxResults((int) page.getPageSize()); //
}
List<Map> tListMap = queryList.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
return tListMap;
}
}
分享到:
相关推荐
Hibernate分页查询小结
#### 三、Hibernate分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...
此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...
让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults...
hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...
总结起来,"hibernate分页代码"是一个关于如何在Hibernate中进行分页查询的实践示例,适用于在MyEclipse环境下运行。通过Criteria API或HQL,开发者能够方便地实现分页功能,提升应用性能,为用户提供更好的体验。...
在"Struts + Hibernate 分页实现"这个项目中,重点在于如何在Web应用中整合这两个框架,并实现数据的分页显示。分页是大型数据集处理时常见的需求,它能够帮助用户更有效地浏览和管理大量信息,避免一次性加载所有...
本篇文章将详细讲解如何在基于Struts2、Spring和Hibernate的项目中实现分页功能。 首先,我们从DAO层开始。在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两...
在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先,需要在项目中引入Struts和Hibernate的相关库,配置Struts的struts-config.xml文件和...
1. **配置Hibernate分页**: 在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query` API则对应于原生的SQL语句。在这些API中,我们可以...
hibernate分页 博文链接:https://iomo.iteye.com/blog/243518
本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...
这个"高效率的dw+spring+hibernate分页演示例子"提供了一个实用的示例,展示了如何将这三个框架整合起来,以实现高效的数据分页功能。 首先,让我们来逐一了解这三个技术: 1. **DWR (Direct Web Remoting)**:DWR...
### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...
综上所述,"struts+hibernate分页"涉及到的主要是如何在Struts的控制层和Hibernate的数据层之间协调处理分页请求,以及在DAO层利用Hibernate的特性实现数据库查询的分页。理解并掌握这两个框架的分页机制,对于开发...
java 实现的一个简单的hibernate分页类 可以设置,从某一条开始取、显示的条数 不依赖struts spring
本教程将通过一个具体的“hibernate分页例子”来深入理解如何在Hibernate中实现分页功能。 在实际应用中,当数据量大到一定程度时,一次性加载所有数据会导致内存压力过大,影响系统性能。因此,分页查询成为一种...
本主题将探讨如何在Hibernate分页类和JDBC的SQL分页方法之间实现完美的融合,以提高性能并提供更好的用户体验。 首先,让我们了解一下Hibernate的分页功能。Hibernate提供了一种方便的方式来处理分页查询,通过...