`
longgangbai
  • 浏览: 7309203 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 

 

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

分享到:
评论
7 楼 爱老虎哟 2010-04-05  
确实是很好的东西
6 楼 MrLee23 2010-02-23  
longgangbai 写道
lt0604 写道
用“DetachedCriteria”不是很好吗?


  这个东西好像使用时有点局限性,忘了?

有局限性吗?~如果有的话,只能说表设计的不合理,可以多添加一个表就能解决很多问题`我是这么认为~
我一直用DetachedCriteria感觉不错~很符合JAVA开发的标准
5 楼 longgangbai 2010-02-23  
xieyongwei 写道
虽纯属砖块代码,但较为通用!



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


  这个东西好像使用时有点局限性,忘了?
3 楼 lt0604 2010-02-23  
用“DetachedCriteria”不是很好吗?
2 楼 xieyongwei 2010-02-22  
虽纯属砖块代码,但较为通用!
1 楼 上杉t 2010-02-22  
没注释,楼主。

相关推荐

    Hibernate中Criteria的完整用法

    Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时...在实际项目中,可以根据需求选择使用HQL(Hibernate Query Language)或Criteria API,两者各有优势,选择取决于具体场景和团队偏好。

    Hibernate-Criteria_模糊查询

    在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...

    Hibernate中Criteria的用法

    Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...

    Hibernate中Criteria的完整用法.docx

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。例如,创建一个 Criteria 实例 org.hibernate.Criteria 接口表示,可以使用 Criteria 的 add(Criterion ...

    Hibernate的Criteria用法总结

    在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...

    Hibernate_Query查询所有数据

    本文将深入探讨如何利用Hibernate查询数据库中的所有记录。 首先,理解Hibernate的基本原理至关重要。Hibernate通过XML配置文件或注解将Java类与数据库表进行映射,使得我们可以使用面向对象的方式来处理数据库操作...

    \Hibernate_query条件查询

    《Hibernate查询条件查询详解》 Hibernate作为Java领域中广受欢迎的对象关系映射(ORM)框架,极大地简化了数据库操作。...在学习和实践中,不断探索和理解Hibernate的查询机制,将使我们在Java开发中游刃有余。

    Hibernate-Criteria 模糊查询

    在Hibernate的Criteria API中,模糊查询主要通过`Restrictions.like()`方法来实现。该方法接受两个参数:字段名和包含通配符的字符串。 ##### 示例1:单字段模糊查询 ```java // 查找名字中包含“Erica”的用户 ...

    Hibernate中的Criteria的认识

    Criteria API基于CriteriaQuery接口,提供了丰富的查询选项,包括排序、分页、聚合函数等,这使得开发者能够更加灵活地进行数据检索。 ### 使用Criteria进行基本查询 在给定的部分内容中,首先展示的是如何使用...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    Hibernate中的查询:HQL、Criteria、原生SQl

    本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    Hibernate Criteria 排序的問題

    ### Hibernate Criteria 排序问题详解 #### 一、前言 在使用Hibernate进行数据库操作时,经常...通过掌握这些知识点,开发者可以更加灵活高效地使用Hibernate Criteria API来进行数据查询和排序操作,提高开发效率。

    Hibernate的Criteria文档

    在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...

    Hibernate中Criteria的使用

    在Java世界里,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用...在实际项目中,根据需求选择合适的查询方式,如HQL、Criteria或Query,是优化性能和提升开发体验的关键。

    Hibernate_query查询数据表中部分字段.

    如果某些查询模式经常被使用,可以定义命名查询,将其写入XML映射文件中,以提高代码可读性和复用性。 6. **动态HQL**: 对于更动态的查询,可以构建HQL字符串,但这可能会引入SQL注入风险,因此要确保正确处理...

    Hibernate_Criteria条件查询数据

    Criteria查询是Hibernate提供的API,与传统的HQL(Hibernate Query Language)查询相比,它更具有动态性和灵活性。Criteria查询允许你在运行时构建查询,这在处理动态或复杂的查询需求时尤其有用。下面我们将深入...

    关联映射hibernate的criteria的用法

    理解源码能帮助你在实际项目中更好地应用和优化Criteria查询。 总之,Hibernate的Criteria API提供了一种方便、灵活的方式来执行数据库查询。通过以上介绍和源码学习,初学者可以迅速上手并熟练运用这一功能。实践...

Global site tag (gtag.js) - Google Analytics