⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hibernategenericdao.java

📁 自己封装的基于spring,hibernate的DAO基类
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		}
		return criteria.list();
	}

	/**
	 * 取得Entity的Criteria.
	 */
	public <T> Criteria getEntityCriteria(Class<T> entityClass) {
		return getSession().createCriteria(entityClass);
	}

	public <T> Criteria getEntityCriteria(Class<T> entityClass, String aliasName) {
		return getSession().createCriteria(entityClass, aliasName);
	}

	public <T> boolean isNotUnique(Class<T> entityClass, String names, String values) {
		Assert.hasText(names);
		Criteria criteria = getEntityCriteria(entityClass).setProjection(Projections.rowCount());
		String[] nameArray = names.split(",");
		String[] valueArray = values.split(",");
		try {
			// 循环加入
			for (int i = 0; i < nameArray.length; i++) {
				criteria.add(Restrictions.eq(nameArray[i], valueArray[i]));
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
			return false;
		}
		return ((Integer) criteria.uniqueResult()) > 0;
	}

	/**
	 * 判断对象某些属性的值在数据库中不存在重复
	 * 
	 * @param names
	 *          在POJO里不能重复的属性列表,以逗号分割 如"name,loginid,password"
	 */
	public <T> boolean isNotUnique(Object entity, String names) {
		Assert.hasText(names);
		Criteria criteria = getEntityCriteria(entity.getClass()).setProjection(Projections.rowCount());
		String[] nameList = names.split(",");
		try {
			// 循环加入
			for (String name : nameList) {
				criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(entity, name)));
			}

			// 以下代码为了如果是update的情况,排除entity自身.

			// 通过Hibernate的MetaData接口取得主键名
			String idPropertyName = getSessionFactory().getClassMetadata(entity.getClass()).getIdentifierPropertyName();
			if (idPropertyName != null) {
				// 通过反射取得entity的主键值
				Object id = PropertyUtils.getProperty(entity, idPropertyName);
				// 如果id!=null,说明对象已存在,该操作为update,加入排除自身的判断
				if (id != null)
					criteria.add(Restrictions.not(Restrictions.eq(idPropertyName, id)));
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
			return false;
		}
		return ((Integer) criteria.uniqueResult()) > 0;
	}

	/**
	 * 分页查询函数,使用Criteria
	 * 
	 * @param pageNo
	 *          页号,从0开始.
	 */
	public Page pagedQuery(Criteria criteria, int pageNo, int pageSize) {
		CriteriaImpl impl = (CriteriaImpl) criteria;

		// 先把Projection和OrderBy条件取出来,清空两者来执行Count操作
		Projection projection = impl.getProjection();
		List<CriteriaImpl.OrderEntry> orderEntries;
		try {
			orderEntries = (List) BeanUtils.getPrivateProperty(impl, "orderEntries");
			BeanUtils.setPrivateProperty(impl, "orderEntries", new ArrayList());
		} catch (Exception e) {
			throw new InternalError(" Runtime Exception impossibility throw ");
		}

		// 执行查询
		int totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();

		// 将之前的Projection和OrderBy条件重新设回去
		criteria.setProjection(projection);
		if (projection == null) {
			criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
		}
		try {
			BeanUtils.setPrivateProperty(impl, "orderEntries", orderEntries);
		} catch (Exception e) {
			throw new InternalError(" Runtime Exception impossibility throw ");
		}

		// 返回分页对象
		if (totalCount < 1)
			return new Page();

		pageNo = getValidPageNo(pageNo, totalCount, pageSize);
		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();

		return new Page(startIndex, totalCount, pageSize, list);
	}
	
	/**
	 * 分页查询函数,使用hql
	 * 
	 * @param pageNo
	 *          页号,从0开始.
	 */
	public Page pagedQuery(String hql, int pageNo, int pageSize) {
		Assert.hasText(hql);
		// 创建查询
		Query query = getSession().createQuery(hql);
		String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
		List countlist = getHibernateTemplate().find(countQueryString);
		int totalCount = (Integer) countlist.get(0);

		// 返回分页对象
		if (totalCount < 1)
			return new Page();

		pageNo = getValidPageNo(pageNo, totalCount, pageSize);

		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();

		return new Page(startIndex, totalCount, pageSize, list);
	}

	/**
	 * 分页查询函数,使用hql
	 * 
	 * @param pageNo
	 *          页号,从0开始.
	 */
	public Page pagedQuery(String hql, int pageNo, int pageSize, Object... args) {
		Assert.hasText(hql);
		// 创建查询
		Query query = getSession().createQuery(hql);
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i, args[i]);
		}
		String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
		List countlist = getHibernateTemplate().find(countQueryString, args);
		int totalCount = (Integer) countlist.get(0);

		// 返回分页对象
		if (totalCount < 1)
			return new Page();

		pageNo = getValidPageNo(pageNo, totalCount, pageSize);

		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();

		return new Page(startIndex, totalCount, pageSize, list);
	}

	public Page pagedQuery(String hql, String params, int pageNo, int pageSize, Object... values) {
		Assert.hasText(hql);
		// 创建查询
		Query query = getSession().createQuery(hql);
		String[] parameterNames = params.split(",");
		for (int i = 0; i < values.length; i++) {
			query.setParameter(parameterNames[i], values[i]);
		}
		String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
		List countlist = getHibernateTemplate().findByNamedParam(countQueryString, parameterNames, values);
		int totalCount = (Integer) countlist.get(0);

		// 返回分页对象
		if (totalCount < 1)
			return new Page();

		pageNo = getValidPageNo(pageNo, totalCount, pageSize);

		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();

		return new Page(startIndex, totalCount, pageSize, list);
	}

	/**
	 * 去除hql的select 子句,未考虑union的情况
	 */
	private static String removeSelect(String hql) {
		Assert.hasText(hql);
		int beginPos = hql.toLowerCase().indexOf("from");
		Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'");
		return hql.substring(beginPos);
	}

	/**
	 * 去除hql的orderby 子句
	 */
	private static String removeOrders(String hql) {
		Assert.hasText(hql);
		Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(hql);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, "");
		}
		m.appendTail(sb);
		return sb.toString();
	}

	/**
	 * 构造Criteria的排序条件默认函数.可供其他查询函数调用
	 * 
	 * @param criteria
	 *          Criteria实例.
	 * @param sortMap
	 *          排序条件.
	 * 
	 * @author yyy
	 */
	public <T> void sortCriteria(Class<T> entityClass, Criteria criteria, Map sortMap) {
		if (!sortMap.isEmpty()) {
			for (Object o : sortMap.keySet()) {
				String fieldName = o.toString();
				String orderType = sortMap.get(fieldName).toString();

				// 处理嵌套属性如category.name,modify_user.id,暂时只处理一级嵌套
				if (fieldName.indexOf('.') != -1) {
					String alias = StringUtils.substringBefore(fieldName, ".");
					String aliasType = alias;
					try {
						//
						aliasType = entityClass.getDeclaredField(alias).getType().getSimpleName();
					} catch (Exception e) {
						logger.error("Get property" + alias + " error");
					}
					criteria.createAlias(aliasType, alias);
				}

				if ("asc".equalsIgnoreCase(orderType)) {
					criteria.addOrder(Order.asc(fieldName));
				} else {
					criteria.addOrder(Order.desc(fieldName));
				}
			}
		}
	}

	/**
	 * 得到正确的页号。
	 * 
	 * @param pageNo
	 * @param totalRows
	 * @param pageSize
	 * @return
	 */
	private int getValidPageNo(int pageNo, int totalRows, int pageSize) {
		if (pageSize == 0) {
			return 1;
		}
		int maxPageNo = (totalRows % pageSize != 0) ? totalRows / pageSize + 1 : totalRows / pageSize;
		if (pageNo > maxPageNo) {
			return maxPageNo;
		} else {
			return pageNo;
		}
	}

	public static void main(String args[]) {
		String[] paths = { "/context/*.xml", "/context/production/*.xml" };
		System.out.println(Math.ceil(1.1));

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -