春天JPA规范,如数字字段

问题描述 投票:0回答:1

我有一个名为 Citizen:

public class Citizen {
    private Long id;
    private String name;
    private Long code;

    //get,set
}

我用的是 Specification 用于搜索 Citizen 与过滤器。

public class CitizenFilter(){
    private String name;
    private Long code;

    // get, set
}

public class CitizenSpecification implements Specification<Citizen>{
    private CitizenFilter filter;
    // get, set

    @Override
    public Predicate toPredicate(Root<Citizen> root, CriteriaQuery<?> query, CriteriaBuilder builder)                
    {
        List<Predicate> restrictions = new ArrayList<>();
        if(filter.getName != null){
            restrictions.add(builder.like(root.get("name"), "%"+filter.getName()+"%"));
        }
        if(filter.getCode != null){
            restrictions.add(builder.like(root.get("code"), "%"+filter.getCode ()+"%"));
        }
        // disjunction().....
        // return expression
    }
}

当我调用API时,它抛出异常: 参数与java.lang.Long类型不匹配。

我知道这个错误,因为我尝试使用 like 与一个数字字段。

我有两个问题。

  • 原生查询如何做到这一点 like 查询数字字段,但JPA查询?

  • 如果有一个方法,我可以做到这一点与JPA,请帮助我 !

先谢谢你

java spring jpa specifications
1个回答
1
投票

在数字列上使用LIKE是不可能的。

这在一些数据库中是可行的,因为当你执行语句时,数据库会将数字转换为一个VARCHAR。

在Criteria API中,你必须将数字转换为一个字符串,就像这样。

restrictions.add(builder.like(root.get("name").as(String.class), "%"+filter.getCode ()+"%"));
© www.soinside.com 2019 - 2024. All rights reserved.