java怎么定义范围_Spring中如何定义Range范围对象

Spring中如何定义Range范围对象

发布时间:2020-11-24 17:04:37

来源:亿速云

阅读:76

作者:Leah

这期内容当中小编将会给大家带来有关Spring中如何定义Range范围对象,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1 实现方式

1.1 范围对象Range定义

import java.io.Serializable;

public class Range implements Serializable {

private static final long serialVersionUID = 1L;

private String field;

private Comparable from;

private Comparable to;

private Boolean includeNull;

public Range(String field) {

this.field = field;

}

public Range(String field, Comparable from, Comparable to) {

this.field = field;

this.from = from;

this.to = to;

}

public Range(String field, Comparable from, Comparable to, Boolean includeNull) {

this.field = field;

this.from = from;

this.to = to;

this.includeNull = includeNull;

}

public Range(Range other) {

this.field = other.getField();

this.from = other.getFrom();

this.to = other.getTo();

this.includeNull = other.getIncludeNull();

}

public String getField() {

return field;

}

public Comparable getFrom() {

return from;

}

public void setFrom(Comparable from) {

this.from = from;

}

public boolean isFromSet() {

return getFrom() != null;

}

public Comparable getTo() {

return to;

}

public void setTo(Comparable to) {

this.to = to;

}

public boolean isToSet() {

return getTo() != null;

}

public void setIncludeNull(boolean includeNull) {

this.includeNull = includeNull;

}

public Boolean getIncludeNull() {

return includeNull;

}

public boolean isIncludeNullSet() {

return includeNull != null;

}

public boolean isBetween() {

return isFromSet() && isToSet();

}

public boolean isSet() {

return isFromSet() || isToSet() || isIncludeNullSet();

}

public boolean isValid() {

if (isBetween()) {

return getFrom().compareTo(getTo()) <= 0;

}

return true;

}

}

1.2 example的Specification

import org.springframework.data.domain.Example;

import org.springframework.data.jpa.convert.QueryByExamplePredicateBuilder;

import org.springframework.data.jpa.domain.Specification;

import org.springframework.util.Assert;

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

/**

* Created by wangyunfei on 2017/6/6.

*/

public class ByExampleSpecification implements Specification {

private final Example example;

public ByExampleSpecification(Example example) {

Assert.notNull(example, "Example must not be null!");

this.example = example;

}

@Override

public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {

return QueryByExamplePredicateBuilder.getPredicate(root, cb, example);

}

}

1.3 Range的Specification

import org.springframework.data.jpa.domain.Specification;

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

import java.util.List;

import static com.google.common.collect.Iterables.toArray;

import static com.google.common.collect.Lists.newArrayList;

import static java.lang.Boolean.FALSE;

import static java.lang.Boolean.TRUE;

/**

* Created by wangyunfei on 2017/6/6.

*/

public class ByRangeSpecification implements Specification {

private final List> ranges;

public ByRangeSpecification(List> ranges) {

this.ranges = ranges;

}

@Override

public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) {

List predicates = newArrayList();

for (Range range : ranges) {

if (range.isSet()) {

Predicate rangePredicate = buildRangePredicate(range, root, builder);

if (rangePredicate != null) {

if (!range.isIncludeNullSet() || range.getIncludeNull() == FALSE) {

predicates.add(rangePredicate);

} else {

predicates.add(builder.or(rangePredicate, builder.isNull(root.get(range.getField()))));

}

}

if (TRUE == range.getIncludeNull()) {

predicates.add(builder.isNull(root.get(range.getField())));

} else if (FALSE == range.getIncludeNull()) {

predicates.add(builder.isNotNull(root.get(range.getField())));

}

}

}

return predicates.isEmpty() ? builder.conjunction() : builder.and(toArray(predicates, Predicate.class));

}

private Predicate buildRangePredicate(Range range, Root root, CriteriaBuilder builder) {

if (range.isBetween()) {

return builder.between(root.get(range.getField()), range.getFrom(), range.getTo());

} else if (range.isFromSet()) {

return builder.greaterThanOrEqualTo(root.get(range.getField()), range.getFrom());

} else if (range.isToSet()) {

return builder.lessThanOrEqualTo(root.get(range.getField()), range.getTo());

}

return null;

}

}

1.4 自定义Repository与实现

import org.springframework.data.domain.Example;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.Pageable;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;

import java.util.List;

@NoRepositoryBean

public interface WiselyRepository extends JpaRepository {

Page queryByExampleWithRange(Example example,List> ranges, Pageable pageable);

}

import org.springframework.data.domain.Example;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.Pageable;

import org.springframework.data.jpa.domain.Specification;

import org.springframework.data.jpa.repository.support.JpaEntityInformation;

import org.springframework.data.jpa.repository.support.SimpleJpaRepository;

import javax.persistence.EntityManager;

import java.io.Serializable;

import java.util.List;

import static org.springframework.data.jpa.domain.Specifications.where;

public class WiselyRepositoryImpl extends SimpleJpaRepository implements

WiselyRepository {

private final EntityManager entityManager;

public WiselyRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {

super(entityInformation, entityManager);

this.entityManager = entityManager;

}

@Override

public Page queryByExampleWithRange(Example example, List> ranges, Pageable pageable) {

Specification byExample = new ByExampleSpecification<>(example);

Specification byRanges = new ByRangeSpecification<>(ranges);

return findAll(where(byExample).and(byRanges),pageable);

}

}

2 使用方式

2.1 开启支持

通过@EnableJpaRepositories(repositoryBaseClass = WiselyRepositoryImpl.class)开启对定义功能的支持。

2.2 示例

实体类

@Entity

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Person {

@Id

@GeneratedValue

private Long id;

private String name;

private Integer height;

@DateTimeFormat(pattern = "yyyy-MM-dd")

private Date birthday;

}

PersonRepository

public interface PersonRepository extends WiselyRepository {

}

测试控制器

@RestController

@RequestMapping("/people")

public class PersonController {

@Autowired

PersonRepository personRepository;

@PostMapping

public ResponseEntity save(@RequestBody Person person){

Person p = personRepository.save(person);

return new ResponseEntity(p, HttpStatus.CREATED);

}

@GetMapping

public ResponseEntity> query(Person person,

@DateTimeFormat(pattern = "yyyy-MM-dd")Date startDate,

@DateTimeFormat(pattern = "yyyy-MM-dd")Date endDate,

Integer startHeight,

Integer endHeight,

Pageable pageable){

Example personExample = Example.of(person);

List> ranges = newArrayList();

Range birthRange = new Range("birthday",startDate,endDate);

Range heightRange = new Range("height",startHeight,endHeight);

ranges.add(birthRange);

ranges.add(heightRange);

Page page = personRepository.queryByExampleWithRange(personExample,ranges,pageable);

return new ResponseEntity>(page,HttpStatus.OK);

}

}

上述就是小编为大家分享的Spring中如何定义Range范围对象了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值