SSH动态查询具体实现之Dao

         
package com.sxdf.manage.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;
import com.sxdf.manage.dao.SnippetDao;

@Component("snippetDao")
public class SnippetDaoImpl implements SnippetDao {
	@Resource(name = "sessionFactory")
	private SessionFactory hu;
     //统计总数(你可以使用count(*),前提是使用另一个HQL语句)
	public int count(final String hql, final Object[] param) {

		int count = 0;
		Session session = hu.getCurrentSession();
		Query query = session.createQuery(hql);

		if (param.length > 0) {
			for (int i = 0; i < param.length; i++) {
				query.setString(i, param[i].toString());
			}
		}

		List list = query.list();

		if (list.size() > 0) {
			count = list.size();
		}
		return count;
	}
     
             //查找当前页数据           
		public List<?> findPublic(final String hql, final Object[] param,
			final int start, final int limit) {
		Session session = hu.getCurrentSession();
		Query query = session.createQuery(hql);
		if (param.length > 0) {
			for (int i = 0; i < param.length; i++) {
				query.setString(i, param[i].toString());
			}
		}

		List<?> list = query.setFirstResult(start).setMaxResults(limit).list();
		return list;
	}
             //得到后半段hql
	        public String getHQL(Object[][] ob, Object[][] like
                          ,String[][] datetime
                          , String[] group,String[] asc, String[] desc) {
                StringBuffer hql = new StringBuffer();
                String ss = null;
                if (null != ob) {
                        for (Object[] o : ob) {
                                 // [key][value] name='value'
                                boolean b = ((null != o[1]) && (null != o[0])
                                                && (!"".equals(o[1].toString())) 
                                                && (!"".equals(o[0].toString())));
                                 if (b) {
                                         hql.append("and j." + o[0] + " =? ");
                                 }
                        }
                }
                if (null != like) {
                        for (Object[] l : like) {
                                 // [key][value] name like '%value%'
                                boolean bl = ((null != l[1]) && (null != l[0])
                                                 && (!"".equals(l[1].toString()))
                                                 && (!"".equals(l[0].toString())));
                                 if (bl) {
                                          hql.append("and j." + l[0] + " LIKE? ");
                                 }
                        }
                 }
                 //时间(模糊)
		if (null != datetime) {


			for (String[] d : datetime) {
				// [key][value]
				boolean bd = ((null != d[1]) && (null != d[0])
						&& (!"".equals(d[1])) && (!"".equals(d[0]
						.toString())));
				if (bd) {

					hql.append("and to_char(j."+ d[0] +",'yyyy-mm-dd')" + " LIKE ? ");
				}
			}


		}
		// 分组 group by [value]

		if (null != group && group.length > 0) {
			StringBuffer groupb = new StringBuffer();

			for (String str1 : group) {
				if (null != str1 && !"".equals(str1)) {

					groupb.append("j." + str1 + " , ");
				}

			}

			if (null != groupb && "".equals("")) {
				hql.append("group by ");
				hql.append(groupb.substring(0, groupb.lastIndexOf(",")));
			}

		}
		// 升序//降序(先升后降) order by [value]
		if (null != asc && asc.length > 0 || null != desc && desc.length > 0) {

			String oy1 = null;
			String oy2 = null;
			// orderb.append("order by ");
			if (null != asc && asc.length > 0) {
				StringBuffer orderb1 = new StringBuffer();
				for (String str2 : asc) {

					if (null != str2 && !"".equals(str2)) {
						orderb1.append("j." + str2 + " , ");

					}
				}

				if (null != orderb1 && "".equals(orderb1)) {
					oy1 = orderb1.substring(0, orderb1.lastIndexOf(","))
							+ " asc ";

				}

			}

			if (null != desc && desc.length > 0) {
				StringBuffer orderb2 = new StringBuffer();
				for (String str3 : desc) {
					if (null != str3 && !"".equals(str3)) {
						orderb2.append("j." + str3 + " , ");
					}
				}

				if (null != orderb2 && !"".equals(orderb2)) {
					oy2 = orderb2.substring(0, orderb2.lastIndexOf(","))
							+ " desc ";

				}
			}

			if ((null != oy2 && !"".equals(oy2))
					|| (null != oy1 && !"".equals(oy1))) {
				hql.append("order by ");
				if (null != oy1 && !"".equals(oy1)) {
					hql.append(oy1);
				}
				if ((null != oy2 && !"".equals(oy2))
						&& (null != oy1 && !"".equals(oy1))) {
					hql.append(" , ");
				}
				if (null != oy2 && !"".equals(oy2)) {
					hql.append(oy2);
				}

			}

		}

		if (hql.toString().contains("and")) {
			ss = hql.substring(4, hql.length());

		}

		return ss;
	}
              //选值(=、like)
	public List<Object> getValue(Object[][] ob, Object[][] like,String[][] datetime) {
		List<Object> list = new ArrayList<Object>();
		
		if (null != ob) {


			for (Object[] o : ob) {
				// [key][value]
				boolean b = ((null != o[1]) && (null != o[0])
						&& (!"".equals(o[1].toString())) && (!"".equals(o[0]
						.toString())));
				if (b) {


					list.add(o[1]);
				}


			}
		}
		
		if (null != like) {


			for (Object[] l : like) {
				// [key][value]
				boolean bl = ((null != l[1]) && (null != l[0])
						&& (!"".equals(l[1].toString())) && (!"".equals(l[0]
						.toString())));
				if (bl) {


					list.add("%" + l[1] + "%");
				}
			}


		}
		
		//时间(模糊)
		if (null != datetime) {


			for (String[] d : datetime) {
				// [key][value]
				boolean bd = ((null != d[1]) && (null != d[0])
						&& (!"".equals(d[1])) && (!"".equals(d[0]
						.toString())));
				if (bd) {


					list.add("%" + d[1] + "%");
				}
			}


		}


		return list;
	}

}

由于删掉一些其他无关的类方法,故可能存在 一些无用的import引入,对代码无影响
       
         总结一下:本文大量使用if-else的运用,大大降低阅读效果。 如果大家有好的方法和建议,洗耳恭听。
         对sessionFactory 使用注解,
         其中本类所继承的SnippetDao为上一篇中特意介绍的Dao接口方法,详细说明请参考上文-- SSH动态查询具体实现之service
            Action 调取示例:

         首先引入SnippetService

@Resource(name = "snippetServiceImpl")
	private SnippetService ss;

         接下来,在action方法利用本接口实现你想要的查询

  Object[][] aa1 =null;
	    Object[][] aa2 =null;
	    String[] group =null;
	    String[] asc =null;
	    String[] desc = null;;
	 ActionWriteUtil.writeStr(JsonUtil.getPurchaseJson((List<Purchase>)ss.search(Purchase.class, aa1,aa2 ,null,group,asc,desc,start, limit),
                                   ss.count(Purchase.class, aa1,aa2,null,group,asc,desc)));

          针对任何bean,无需在其service或dao层再写查询方法(对bean属性*查询,   比较、平均值等特殊查询除外)

相关文章:

SSH动态查询封装接口介绍

SSH动态查询具体实现之service

你可能感兴趣的:(HQL,ssh,封装,动态查询,多条件)