Anda dapat melakukannya dengan mudah dengan JpaSpecificationExecutor
dan Specification
custom khusus :https://spring .io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
Saya akan mengganti HashMap dengan DTO yang berisi semua parameter get opsional, kemudian membuat spesifikasi berdasarkan DTO itu, jelas Anda juga dapat menyimpan HashMap dan membangun spesifikasi berdasarkan itu.
Pada dasarnya:
public class VehicleFilter implements Specification<Vehicle>
{
private String art;
private String userId;
private String vehicle;
private String identifier;
@Override
public Predicate toPredicate(Root<Vehicle> root, CriteriaQuery<?> query, CriteriaBuilder cb)
{
ArrayList<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(art))
{
predicates.add(cb.equal(root.get("art"), art));
}
if (StringUtils.isNotBlank(userId))
{
predicates.add(cb.equal(root.get("userId"), userId));
}
if (StringUtils.isNotBlank(vehicle))
{
predicates.add(cb.equal(root.get("vehicle"), vehicle));
}
if (StringUtils.isNotBlank(identifier))
{
predicates.add(cb.equal(root.get("identifier"), fab));
}
return predicates.size() <= 0 ? null : cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
// getter & setter
}
Dan pengontrolnya:
@RequestMapping(value = "/{ticket}/count", method = RequestMethod.GET)
public long getItemsCount(
@PathVariable String ticket,
VehicleFilter filter,
HttpServletRequest request
) throws Exception
{
return vehicleService.getCount(filter);
}
Layanan:
@Override
public long getCount(VehicleFilter filter)
{
return vehicleRepository.count(filter);
}
Repositori:
@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, Integer>, JpaSpecificationExecutor<Vehicle>
{
}
Hanya contoh cepat yang diadaptasi dari kode perusahaan, Anda mengerti!