📄 hibernategenericdao.java
字号:
}
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 + -