spring data jpa 如何用Specification根据加@Convert注解的属性动态查询,条件是in
brandList数据 在数据库是person表的brandList列的字符串数据。
@Entity(name = "person")
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
@ToString
public class Person implements EntityObject {
//Brand is a enum class
@Convert(converter = JsonConverter.class)
private List brandList = new ArrayList <>();
public static class JsonConverter implements AttributeConverter, String> {
@Override
public String convertToDatabaseColumn(List list) {
return JSON.toJSONString(list);
}
@Override
public List<Brand> convertToEntityAttribute(String s) {
return JSON.parseArray(s, Brand.class);
}
}
}
/**
*
-
PersonRepository is a common custom interface without @Repository
*/
@Repository
public class PersonRepositoryImpl extends SimpleJpaRepository implements PersonRepository {public PersonRepositoryImpl(@Autowired EntityManager em) {
super(Person.class, em);
}@Override
public List test(List brandList) {return super.findAll((root, query, cb) -> { List<Predicate> predicates = new ArrayList(); /* Predicate predicate=cb.in(root.get("brandList")); predicate.in(brandList); */ brandList.forEach(brand -> { Predicate predicate=cb.like(root.get("brandList"),"%"+brand+"%"); predicates.add(predicate); }); Predicate[] pre = new Predicate[predicates.size()]; return query.where((Predicate[]) predicates.toArray(pre)).getRestriction(); });
}
}