首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

项目中Hibernate中Criteria跟Query查询和模式引用

2012-10-08 
项目中Hibernate中Criteria和Query查询和模式引用????? ?在项目中Hibernate中Criteria和Query查询,总是缺

项目中Hibernate中Criteria和Query查询和模式引用

????? ?在项目中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);
?}

?

?

代码实属完整,哈哈,以备后用!希望同学们拍砖哦 !!

1 楼 上杉t 2010-02-22   没注释,楼主。 2 楼 xieyongwei 2010-02-22   虽纯属砖块代码,但较为通用! 3 楼 lt0604 2010-02-23   用“DetachedCriteria”不是很好吗? 4 楼 longgangbai 2010-02-23   lt0604 写道用“DetachedCriteria”不是很好吗?

  这个东西好像使用时有点局限性,忘了? 5 楼 longgangbai 2010-02-23   xieyongwei 写道虽纯属砖块代码,但较为通用!


其实如果“砖块代码”一次可以通用这也达到目的了 ,^_^,为了就是这个通用 6 楼 MrLee23 2010-02-23   longgangbai 写道lt0604 写道用“DetachedCriteria”不是很好吗?

  这个东西好像使用时有点局限性,忘了?
有局限性吗?~如果有的话,只能说表设计的不合理,可以多添加一个表就能解决很多问题`我是这么认为~
我一直用DetachedCriteria感觉不错~很符合JAVA开发的标准 7 楼 爱老虎哟 2010-04-05   确实是很好的东西

热点排行