项目中Hibernate中Criteria和Query查询和模式引用
2011-09-01 13:25
423 查看
在项目中Hibernate中Criteria和Query查询,总是缺少不了一些列的判断等,无论数据类型是什么,这些是必须的,最终动态添加的也是的获取Criteria和Query组成的hql,于是公司兄弟将Criteria和Query进行了抽出封装,采用设计模式中Builder的模式将组成hql过程的判断进行封装组合,使大家在使用时减少了判断是否为空或者空字符串等,细细的相信其实这也是设计模式的一部分好处吧!
封装类如下:
封装类如下:
public class DynamicQuery { private StringBuilder hql = new StringBuilder(); public List<String> parameterNames = new ArrayList<String>(); public List<Object> parameterValues = new ArrayList<Object>(); public List<String> getParameterNames() { return parameterNames; } public List<Object> getParameterValues() { return parameterValues; } public DynamicQuery(String hql) { this.hql.append(hql); } public DynamicQuery append(String hql) { return append(hql, (String[]) null, (String[]) null); } public DynamicQuery appendIfTrue(String hql, boolean condition) { if (condition) { append(hql); } return this; } public DynamicQuery append(String hql, String[] names, Object[] values) { this.hql.append(" ").append(hql); if (names != null && names.length != 0) { parameterNames.addAll(Arrays.asList(names)); } if (values != null && values.length != 0) { parameterValues.addAll(Arrays.asList(values)); } return this; } public DynamicQuery append(String hql, List<String> names, List<Object> values){ this.hql.append(" ").append(hql); if (names != null && !names.isEmpty()) { parameterNames.addAll(names); } if (values != null && !values.isEmpty()) { parameterValues.addAll(values); } return this; } public DynamicQuery append(String hql, String name, Object value) { return append(hql, new String[]{name}, new Object[]{value}); } public DynamicQuery appendIfNotNull(String hql, String name, Object value) { if (value != null) { return append(hql, name, value); } return this; } public DynamicQuery appendIfNotEmpty(String hql, String name, String value) { if (StringUtils.isNotBlank(value)) { return append(hql, name, StringUtils.trim(value)); } return this; } public DynamicQuery appendIfNotEmpty(String hql, String name, Collection<?> collection) { if (CollectionUtils.isNotEmpty(collection)) { return append(hql, name, collection); } return this; } public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value) { return appendLikeIfNotEmpty(hql, name, value, MatchMode.ANYWHERE); } public DynamicQuery appendLikeIfNotNull(String hql,String name, Long value){ if(null != value){ return append(hql,name,value); } return this; } public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value, MatchMode matchMode) { if (StringUtils.isNotBlank(value)) { return appendLike(hql, name, value, matchMode); } return this; } private DynamicQuery appendLike(String hql, String name, String value, MatchMode matchMode) { //TODO check me for some days String regex = "(?i)\\slike\\s+:" + name + "(?=(\\s|\\)|$))"; Matcher matcher = Pattern.compile(regex).matcher(hql); if (matcher.find()) { int appendStart = matcher.end(); String front = StringUtils.substring(hql, 0, appendStart); String back = StringUtils.substring(hql, appendStart); String likeHql = front + " escape \'^\' " + back; String likeValue = StringUtils.trim(value).replaceAll("%", "^%").replaceAll("_", "^_"); return append(likeHql, name, matchMode.toMatchString(likeValue)); } throw new IllegalArgumentException("Like hql[" + hql + "] is error format."); } public DynamicQuery appendIfNotEmpty(String hql, String name, Object[] values) { return appendIfNotEmpty(hql, name, values != null ? Arrays.asList(values) : Collections.EMPTY_LIST); } public String getQueryString() { return this.hql.toString(); } /** * Apply the given name parameter to the given Query object. * * @param query the Query object * @param name the name of the parameter * @param value the value of the parameter */ @SuppressWarnings("unchecked") private void setParameter(Query query, String name, Object value) { if (value instanceof Collection) { query.setParameterList(name, (Collection) value); } else if (value instanceof Object[]) { query.setParameterList(name, (Object[]) value); } else { query.setParameter(name, value); } } public Query build(Session session) { Query query = session.createQuery(this.getQueryString()); if (parameterNames != null && !parameterNames.isEmpty()) { for (int i = 0; i < parameterNames.size(); i++) { this.setParameter(query, parameterNames.get(i), this.parameterValues.get(i)); } } return query; } } 使用代码如下: /** * 分页查询时使用 * * @param <T> * @param paginater * @param searchCondition * @return */ public <T> Paginater<T> paginate(Paginater<T> paginater, final ProductItemPriceCondition searchCondition) { Sorter sorter = paginater.getSorter(); if (sorter.isEmpty()) { sorter = new Sorter().asc("p.startDate"); } LimitedList<T> limitedList = findByQuery(new QueryCreator() { public Query createQuery(Session session) { DynamicQuery dynamicQuery = new DynamicQuery("select distinct p from " + searchCondition.getForTypeName() + " p where (1 = 1) "); dynamicQuery.appendIfNotNull(" and p.startDate<=:endDate ", "endDate", searchCondition.getEndDate()); dynamicQuery.appendIfNotNull(" and p.endDate>=:startDate ", "startDate", searchCondition.getStartDate()); dynamicQuery.appendIfNotNull("and p.productId=:productId ", "productId", searchCondition.getProductId()); return dynamicQuery.build(session); } }, paginater.getLimit(), sorter); return paginater.fromLimitedList(limitedList); }
相关文章推荐
- (详细)Hibernate查询技术(Query、Session、Criteria),Hibernate的三种状态,Hibernate集合struts2实现登录功能(二)
- Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;可以将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
- Hibernate 的查询语言 Criteria 和Query
- Hibernate框架第二天(一级缓存、Query和Criteria查询接口)
- Hibernate的 SessionFactory,Configuration,Query ,Criteria接口简介,及Query的查询方法
- SSH项目,hibernate的查询操作出错org.hibernate.hql.ast.QuerySyntaxException
- Hibernate_查询_QueryByCriteria的方式
- Hibernate和Spring整合中数据查询hql与Criteria Query
- Hibernate条件查询(Criteria Query)
- Hibernate 中 load方法与get方法以及Query查询与Criteria查询
- 【转】Hibernate动态条件查询(Criteria Query)
- Hibernate条件查询(Criteria Query)
- Hibernate条件查询(Criteria Query)
- Hibernate条件查询(Criteria Query)
- [转]Hibernate条件查询(Criteria Query)
- hibernate简单事例,注意事项,保存,更新,删除,session,Query,Criteria查询_Hql与Criteria查询的补充知识
- hibernate中的Query查询和criteria查询的区别
- Hibernate动态条件查询(Criteria Query)
- (详细)Hibernate查询技术(Query、Session、Criteria),Hibernate的三种状态,Hibernate集合struts2实现登录功能(二)
- Criteria Query—Hibernate之面向对象查询