`

通用的DAO查询,常见方法集合

 
阅读更多

import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class GenericDao extends HibernateDaoSupport{
    private ThreadLocal<Session> sessions = new ThreadLocal<Session>();
    private ThreadLocal<Transaction> transactions = new ThreadLocal<Transaction>();
    public synchronized Session getMySession(){
        Session session = sessions.get();
        if(session==null){
            session = getSession();
            transactions.set(session.beginTransaction());
            sessions.set(session);
        }else
        if(!session.isOpen()){
            session = getSession();
            transactions.set(session.beginTransaction());
            sessions.set(session);
        }
        return session;
    }
    public synchronized void commitMySession(){
        Session session = sessions.get();
        if(session!=null&&session.isOpen()){
            transactions.get().commit();
            session.close();
        }
        transactions.remove();
        sessions.remove();
    }
    public synchronized void rollbackMySession(){
        Session session = sessions.get();
        if(session!=null&&session.isOpen()){
            transactions.get().rollback();
            session.close();
        }
        transactions.remove();
        sessions.remove();
    }
    public <T> T get(Class<T> clazz, Serializable id){
        return (T)getHibernateTemplate().get(clazz, id);
    }
    public <T> T load(Class<T> clazz, Serializable id){
        return (T)getHibernateTemplate().load(clazz, id);
    }
    public <T> void save(T entity){
//        System.out.println("---->gdao.save("+entity.getClass().getName()+")----");
        getHibernateTemplate().save(entity);
    }
    public <T> void update(T entity){
        getHibernateTemplate().update(entity);
    }
    public <T> void delete(T entity){
        getHibernateTemplate().delete(entity);
    }
  
    public int execUpdateSQL(String sql, Serializable...values){
        Session sess = getMySession();
        SQLQuery query = sess.createSQLQuery(sql);
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        return query.executeUpdate();
    }
    public Long getFirstLong(String sql, final Serializable... values) throws Exception{
        List<String> params = new ArrayList<String>(1);
        List<Type> types = new ArrayList<Type>(1);
        params.add("c"); types.add(Hibernate.INTEGER);
        Object obj = findUnique(sql, params, types, values);
        if(obj==null){
            return -1L;
        }
        if(obj instanceof Object[]){
            obj = ((Object[])obj)[0];
        }
        if(obj instanceof Number){
            return ((Number)obj).longValue();
        }
        return -1L;
    }
//    public Long getFirstLong(String sql,  List<String>params, List<Type>types) throws Exception{
//        Object[] obj = findUnique(sql, params, types);
//        if(obj==null||obj.length==0){
//            return -1L;
//        }
//        Object object = obj[0];
//        if(object instanceof Number){
//            return ((Number)object).longValue();
//        }
//        return -1L;
//    }
    public List<?> find(String hql){
        return getHibernateTemplate().find(hql);
    }
//    public List<?> find(String hql, final Object...values){
//        logger.info(hql);
//        return getHibernateTemplate().find(hql, values);
//    }
  
    public <T> List<T> findByPage(Class<T> clazz, final int start, final int limit, final String where, final Serializable... values){
        String hql = "from " + clazz.getName() + " as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        final String fHql = hql;
        return getHibernateTemplate().executeFind(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query q = session.createQuery(fHql);
                if(values!=null&&values.length>0){
                    for(int i=0; i<values.length; i++){
                        q.setParameter(i, values[i]);
                    }
                }
                q.setFirstResult(start).setMaxResults(limit);
                return q.list();
            }
          
        });
    }
    public <T> List<T> find(Class<T> clazz, final String where, final Serializable... values){
        String hql = "from " + clazz.getSimpleName()+" as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        return getHibernateTemplate().find(hql, values);
    }
    public long getTotalCountByHql(Class<?> clazz, final String where, final Serializable... values) throws Exception {
        String hql = "select count(*) from " + clazz.getSimpleName()+" as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        List<Number> cs = getHibernateTemplate().find(hql, values);
        if(cs!=null&&cs.size()>0){
            Number n = cs.get(0);
            return n.longValue();
        }
        return 0;
    }
    public long getTotalCount(Class<?> clazz, final String where, final Serializable... values) throws Exception {
        String sql = "select count(1) as c from " + clazz.getSimpleName() + " e";
        if(where!=null&&where.length()>0){
            sql += " where " + where;
        }
        return getFirstLong(sql, values);
    }
  
    public long getTotalCount(String sql, final Serializable... values) throws Exception {
        return getFirstLong(sql, values).longValue();
    }
    public Object[] findUnique(final String sql,  List<String>params, List<Type>types, final Serializable...values) {
        Session sess = getMySession();
        logger.debug("------findUnique.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        for(int j=0; j<params.size(); j++){
            query.addScalar(params.get(j), types.get(j));
        }
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        query.setMaxResults(1);
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return null;
        }
        Object obj = list.get(0);
        if(obj==null){
            return null;
        }
        logger.debug("obj.type="+obj.getClass().getName());
        if(!obj.getClass().isArray()){//如果返回值不是数组,则要进行相关的处理
            if(obj instanceof Number){
                if(obj instanceof Long){
                    return new Long[]{(Long)(obj)};
                }
                if(obj instanceof Integer){
                    return new Long[]{new Long((Integer)obj)};
                }
                return new Number[]{(Number)obj};
            }
            return new Object[]{obj};
        }
        return (Object[])obj;
    }
    public List<Object[]> find(final String sql, List<String>params, List<Type>types, final Serializable... values) {
        Session sess = getMySession();
        logger.debug("------find.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
      
        for(int j=0; j<params.size(); j++){
            query.addScalar(params.get(j), types.get(j));
        }
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        return query.list();
    }
    public long getNextId(String sequence) throws Exception{
        String sql = "select "+sequence+".nextval as nextid from dual";

        Session sess = getMySession();
        logger.debug("------generateId.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        query.addScalar("nextid", Hibernate.LONG);
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return -1L;
        }
        Object obj = list.get(0);
        logger.debug("obj.type="+obj.getClass().getName());
        if(obj instanceof Number){
            return ((Number)obj).longValue();
        }
        return -1L;
    }
    public boolean exists(String sql, final Object...values) throws Exception{
        Session sess = getMySession();
        logger.debug("------exists.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        for(int i=0; i<values.length; i++){
            query.setParameter(i, values[i]);
        }
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return false;
        }
        return true;
    }

}

分享到:
评论

相关推荐

    Access+2000中文版高级编程

    14.1 理解ActiveX Windows通用控件 433 14.1.1 使用TabStrip控件 434 14.1.2 使用Access选项卡和使用ActiveX TabStrip控件的区别 436 14.2 ImageList控件详述 438 14.2.1 在设计阶段添加图像 438 14.2.2 ...

    Access 2000中文版高级编程(part1)

    14.1 理解ActiveX Windows通用控件 433 14.1.1 使用TabStrip控件 434 14.1.2 使用Access选项卡和使用ActiveX TabStrip控件的区别 436 14.2 ImageList控件详述 438 14.2.1 在设计阶段添加图像 438 14.2.2 在运行...

    spring杂谈 作者zhang KaiTao

    1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结 1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor扩展点-2 1.8 Spring...

    Spring.3.x企业应用开发实战(完整版).part2

    12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger ...

    Spring3.x企业应用开发实战(完整版) part1

    12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger ...

    java面试题

    答:CTS 通用类型系统、CLS 通用语言规范、CLR 公共语言运行时。 Struts1和Struts2原理和区别? 答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.5.8 使用Map集合记录关联实体 423 10.5.9 对关联实体进行排序 424 10.6 继承关系映射 426 10.6.1 整个类层次对应一张表的 映射策略 427 10.6.2 连接子类的映射策略 430 10.6.3 每个具体类对应一张表的 映射策略 ...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    MySQL 5.1中文手冊

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    mysql官方中文参考手册

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    MYSQL中文手册

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3...

    MySQL 5.1参考手册中文版

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3....

    MySQL 5.1参考手册

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    MySQL 5.1参考手册 (中文版)

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.2.7. 执行查询 11.2.8. 更新数据库 11.3. 控制数据库连接 11.3.1. DataSourceUtils类 11.3.2. SmartDataSource接口 11.3.3. AbstractDataSource类 11.3.4. SingleConnectionDataSource类 11.3.5. ...

    MySQL5.1参考手册官方简体中文版

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    MySQL 5.1官方简体中文参考手册

    5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多...

    mysql5.1中文手册

    通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器...

Global site tag (gtag.js) - Google Analytics