Spring JPA 规范,如数字字段
Spring JPA specification like number field
我有一个 table 名为 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 做到这一点,请帮助我!
先谢谢你
无法对数字列进行 LIKE。
这适用于某些数据库,因为在执行语句时会将数字转换为 VARCHAR。
要使用 Criteria API 执行此操作,您必须将数字转换为这样的字符串:
restrictions.add(builder.like(root.get("name").as(String.class), "%"+filter.getCode ()+"%"));
我有一个 table 名为 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 做到这一点,请帮助我!
先谢谢你
无法对数字列进行 LIKE。
这适用于某些数据库,因为在执行语句时会将数字转换为 VARCHAR。
要使用 Criteria API 执行此操作,您必须将数字转换为这样的字符串:
restrictions.add(builder.like(root.get("name").as(String.class), "%"+filter.getCode ()+"%"));