【问题标题】:How to query by age on spring boot specification如何按年龄查询spring boot规范
【发布时间】:2021-12-30 07:49:22
【问题描述】:
@Entity
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "full_name", nullable = false, length = 50)
    private String fullName;
    @Column(name = "current_location", nullable = false)
    private String currentLocation;
    @Column(name = "gender", nullable = false, length = 6)
    private String gender;
    @Column(name = "birth_date", nullable = false)
    private Timestamp birthDate;
}

我使用以下按性别过滤用户

public class SearchSpecification implements Specification<Users> {
    private List<SearchCriteria> list;
    public SearchSpecification() {
        this.list = new ArrayList<>();
    }
    public void add(SearchCriteria criteria) {
        list.add(criteria);
    }
    @Override
    public Predicate toPredicate(Root<UserActualDatum> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

           predicates.add(builder.like(root.<String>get(criteria.getKey()), (String) criteria.getValue()));
           return builder.and(predicates.toArray(new Predicate[0]));
    }
}

但我想按年龄过滤用户,我有 birthDate 列存储用户的出生日期。可以使用 AGE() 函数在 postgres 数据库中计算年龄,但是当我来到 Spring Specification Query 时,我无法从出生日期计算年龄并通过计算年龄进行过滤。

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    我添加了年龄列,我们可以得到年龄而不需要任何计算

    @Entity
    public class Users {
        ...
        @Formula("date_part('year',AGE(current_date,birth_date))")
        @Column(name = "age")
        private Integer age;
    }
    

    在计算年龄的 POSTGRES 上创建函数

    CREATE OR REPLACE FUNCTION get_age( birthday timestamp )
    RETURNS integer
    AS $CODE$
    BEGIN
        RETURN date_part('year',age(birthday));
    END
    $CODE$
    LANGUAGE plpgsql IMMUTABLE;
    

    我通过添加将从出生日期计算的年龄列来修改表格

        CREATE TABLE Users (
            ....
            birth_date timestamp not null,
            age text GENERATED ALWAYS AS (get_age(birth_date)) stored 
        );
    

    现在我可以将ageage 过滤为从birth_date 派生的整数值

    当我们进行 Spring boot 规范查询时,现在这项工作

    public class SearchSpecification implements Specification<Users> {
        private List<SearchCriteria> list;
        public SearchSpecification() {
            this.list = new ArrayList<>();
        }
        public void add(SearchCriteria criteria) {
            list.add(criteria);
        }
        @Override
        public Predicate toPredicate(Root<UserActualDatum> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
    
                    predicates.add(builder.lessThanOrEqualTo(
                            root.<Integer>get(criteria.getKey()), (Integer) criteria.getValue()));
    
               return builder.and(predicates.toArray(new Predicate[0]));
        }
    }
    

    资源:How to compute a derived age attribute in postgresql?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2022-01-19
      • 2011-02-01
      • 1970-01-01
      相关资源
      最近更新 更多