`

spring-data 使用时,多条件查询

 
阅读更多

在spring data 使用中

接口:
/**
* 图联币管理:通过批次号,发放时间,截止时间,查询图联币发放情况。
* @author:      LJ
* @Create at:   2011-11-1
* @param couponIssueBatchNum
* @param issueStartTime
* @param issueEndTime
* @param stopStartTime
* @param stopEndTime
* @return
*/
public List<CouponIssue> queryByMutiCondition(String couponIssueBatchNum,
Date issueStartTime, Date issueEndTime, Date stopStartTime,
Date stopEndTime);

实现:

@PersistenceContext
private EntityManager em;

@Override
public List<CouponIssue> queryByMutiCondition(String couponIssueBatchNum,
Date issueStartTime, Date issueEndTime, Date stopStartTime,
Date stopEndTime) {

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<CouponIssue> query = builder
.createQuery(CouponIssue.class);
Root<CouponIssue> couponIssue = query.from(CouponIssue.class);
query.select(couponIssue);

List<Predicate> predicateList = new ArrayList<Predicate>();

Predicate couponIssueBatchNumPredicate;

// 处理批次号不为空的条件,则表示用户通过批次号查询。
if ((couponIssueBatchNum != null) && (!(couponIssueBatchNum.isEmpty()))) {
couponIssueBatchNumPredicate = builder
.equal(couponIssue.get("couponIssueBatchNum"),
couponIssueBatchNum);
// builder.between(v, x, y)
predicateList.add(couponIssueBatchNumPredicate);
}
// 发放时间处理
Predicate issueDate;

// 因为CriteriaBuilder 的比较函数传递的是expression 所以把时间构造成date类型的表达式

// 表进行传递
Expression<Date> issueStart = builder.literal(issueStartTime);
Expression<Date> issueEnd = builder.literal(issueEndTime);

//Expression<String> issueString = couponIssue.get("issueDate"); 2011-11-03 18:00:56
//couponIssue.get("issueDate");


// 传递的时间进行转换
EntityType<CouponIssue> ci_ = couponIssue.getModel();

if (issueStartTime != null && issueEndTime != null) {
issueDate = builder
.between(couponIssue.get(ci_.getSingularAttribute("issueDate", Date.class)), issueStart, issueEnd);
predicateList.add(issueDate);
}

Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
query.where(predicates);

return em.createQuery(query).getResultList();
}

 

多条件分页查询

 

在springdata 中分页采用是返回 Page<T> 的方式:

如例子

// 接口实现 获取图联币的列表。

@Override
    public Page<CouponIssue> queryByMutiCondition(String couponIssueBatchNum,
            Date issueStartTime, Date issueEndTime, Date stopStartTime,
            Date stopEndTime, Pageable pageable) {

        Specification<CouponIssue> spec = CouponIssueSpecs
                .queryByMutiCondition(couponIssueBatchNum, issueStartTime,
                        issueEndTime, stopStartTime, stopEndTime)
;
        return couponIssueRepository.findAll(spec, pageable);
    }

 

方法调用:

// queryByMutiCondition
    public static Specification<CouponIssue> queryByMutiCondition(
            String couponIssueBatchNum, Date issueStartTime, Date issueEndTime,
            Date stopStartTime, Date stopEndTime) {

        final String cibn = couponIssueBatchNum;
        final Date ist = issueStartTime;
        final Date iet = issueEndTime;
        final Date sst = stopStartTime;
        final Date set = stopEndTime;

        return new Specification<CouponIssue>() {

            @Override
            public Predicate toPredicate(Root<CouponIssue> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {

                Predicate pc = null;
                Root<CouponIssue> couponIssue = query.from(CouponIssue.class);
                EntityType<CouponIssue> ci_ = couponIssue.getModel();
                // query.select(couponIssue);

                // 存放多个条件
                List<Predicate> predicateList = new ArrayList<Predicate>();

                Predicate couponIssueBatchNumPredicate;

                // 处理批次号不为空的条件,则表示用户通过批次号查询。
                if ((cibn != null) && (!(cibn.isEmpty()))) {
                    couponIssueBatchNumPredicate = cb.equal(
                            couponIssue.get("couponIssueBatchNum"), cibn);
                    // builder.between(v, x, y)
                    predicateList.add(couponIssueBatchNumPredicate);
                }
                // 发放时间处理
                Predicate issueDate;

                if (ist != null && iet != null) {
                    Expression<Date> issueStart = cb.literal(ist);
                    Expression<Date> issueEnd = cb.literal(iet);
                    issueDate = cb.between(couponIssue.get(ci_
                            .getSingularAttribute("issueDate", Date.class)),
                            issueStart, issueEnd);
                    predicateList.add(issueDate);
                }

                // 截止时间处理
                Predicate stopDate;

                if (sst != null && set != null) {
                    Expression<Date> stopStart = cb.literal(sst);
                    Expression<Date> stopEnd = cb.literal(set);
                    stopDate = cb.between(
                            couponIssue.get(ci_.getSingularAttribute(
                                    "stopIssueDate", Date.class)), stopStart,
                            stopEnd);
                    predicateList.add(stopDate);
                }
                // 公共
                Predicate[] predicates = new Predicate[predicateList.size()];
                predicateList.toArray(predicates);
               
                CriteriaQuery<?> cqy = query.where(predicates);
                //Selection<?> selectionList = cqy.getSelection();
                pc = cqy.getGroupRestriction();

                return pc;
            }
        };
    }

 

分享到:
评论
2 楼 henghengdh 2013-06-25  
你这个方法如果有个时间条件为空的话还能运行吗?
1 楼 mazongfei 2012-09-28  
老大,xml的sql语句怎么写?

相关推荐

    spring-data源码

    源码中的测试类也是学习的好资源,它们展示了如何使用Spring Data Elasticsearch进行各种操作,并且提供了很多实际场景下的示例。例如,`AbstractElasticsearchIntegrationTestSupport`基类为测试提供了一套完整的...

    SpringBoot中使用Spring-data-jpa分页查询

    在Spring Boot应用中,使用Spring Data JPA进行分页查询是一种高效且简洁的方式。Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库...

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDBTemplate是Spring Data MongoDB的核心组件,它提供了丰富的API来执行常见的数据库操作。 首先,让我们深入...

    最新spring-data-mongo

    【Spring Data MongoDB】是Spring框架的一个重要组成部分,专注于简化MongoDB数据库的访问和操作。Spring Data Commons是一个核心模块,提供了与各种数据存储交互的一般机制,而`spring-data-mongo`则是专门针对...

    spring-data-mongodb-reference 1.5.4

    - **属性表达式**:可以使用属性表达式来构建更复杂的查询条件。 - **特殊参数处理**:支持特殊参数类型,如 Pageable 和 Sort。 **3.3 自定义 Spring Data Repositories 实现** - **添加单个 Repository 的自定义...

    spring-data-commons-1.2.0.M2.zip

    《Spring Data Commons 1.2.0.M2:构建数据访问层的核心库》 Spring Data Commons 是 Spring Data 框架的重要组成部分...虽然资源较少,但对于理解和使用 Spring Data Commons 来说,这个版本仍然具有很高的学习价值。

    spring-data-hadoop官方文档

    Spring Data Hadoop官方文档涉及了多个关于如何使用Spring Data Hadoop框架及其与Hadoop生态系统的集成的相关知识点。以下为文档中提到的主要知识点: 1. **Hadoop基本配置、MapReduce和分布式缓存**: - Spring ...

    Java Spring-data for mongodb

    - 利用Querydsl构建复杂查询:使用Predicate构建查询条件,进行更复杂的查询操作。 - 数据分页与排序:使用Pageable接口实现数据的分页和排序。 - 聚合操作:利用MongoDB的聚合框架,进行数据的统计分析。 6. **...

    spring-data-elasticsearch

    8. Stream处理:在数据处理上,Spring Data Elasticsearch支持使用Java 8的Stream API来处理查询结果,这使得在遍历查询结果集时可以使用函数式编程的风格。 9. Elasticsearch客户端的自动配置:Spring Boot提供了...

    spring-data-elasticsearch基本添删改查,maven项目

    6. **查询和过滤**:通过使用`Query`对象,我们可以构建复杂的查询条件,包括匹配、范围、模糊、排序和分组等。同时,`Sort`和`Pageable`接口用于实现排序和分页功能。 7. **自定义查询方法**:除了预定义的CRUD...

    spring-data-jpa-reference API

    - **2.6.1 合并持久化单元**:支持在同一应用中使用多个持久化单元,满足复杂应用场景的需求。 #### 四、附录 - **A. Namespace 参考**:提供了详细的配置元素说明,如 `&lt;repositories/&gt;` 和 `&lt;repository/&gt;` 等。...

    spring-data-commons1.50

    尽管 Spring Data Commons 是通用的,但与 MongoDB 结合时,它提供了 `MongoTemplate` 和 `MongoRepository`,使得操作 MongoDB 的数据变得更加简单。例如,可以使用 `MongoTemplate` 直接执行 MongoDB 的 CRUD ...

    spring-data-jpa-reference.pdf

    - **合并多个持久化单元**:支持在同一个应用程序中使用多个不同的数据源。 #### 3.2 CDI集成 - **CDI(Contexts and Dependency Injection)集成**:与Java EE容器集成,提供更强大的依赖注入能力。 以上是...

    springboot+spring-data-jpa maven项目

    - Spring Data JPA 提供了 Querydsl 或 Specifications API 来实现动态查询,可以根据参数灵活构造查询条件。 6. **分页查询**: - Spring Data JPA 支持 Pageable 接口,可以通过 PageRequest 实例来指定分页和...

    Spring-Boot1.52 SpringSecurity4 Spring Data Jpa 整合例子

    使用 Spring Data JPA 时,需要定义实体类并标注相应的注解来映射数据库表。 ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-expression-5.2.6.RELEASE.jar`:Spring表达式语言(SpEL),用于在运行时查询和操作对象图。 - `spring-jdbc-5.2.6.RELEASE.jar`:简化了JDBC的使用。 - `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,...

    spring-data-jpa-reference1.3.pdf

    根据提供的文档信息,我们可以深入探讨Spring Data JPA的相关知识点,主要围绕其1.3版本的特性与使用方法展开讨论。 ### Spring Data JPA 概述 Spring Data JPA 是一个强大的框架,它简化了Java Persistence API ...

    spring-data的学习笔记

    SpringData提供了几个预定义的Repository接口,它们扩展了基本的`CrudRepository`接口,提供了更多的功能。 1. **`CrudRepository, ID extends Serializable&gt;`**:提供了基本的CRUD操作(Create, Read, Update, ...

    Spring Data MongoDB中文文档

    - **Spring Data MongoDB** 支持多种类型的查询方法,包括但不限于: - **基本查询**: 如 `findAll()`, `findById()`, `save()`, `deleteById()` 等。 - **条件查询**: 通过方法名称指定查询条件,如 `...

    spring-data-jpa-reference

    综上所述,“spring-data-jpa-reference”文档全面覆盖了 Spring Data JPA 的各个方面,包括 Repository 接口的定义、查询方法的使用、自定义实现、扩展性支持、JPA Repositories 的配置和使用等,对于希望深入了解 ...

Global site tag (gtag.js) - Google Analytics