Bạn có thể thực hiện việc này dễ dàng với JpaSpecificationExecutor
và một Specification
tùy chỉnh : https:// spring .io / blog / 2011/04/26 / advanced-spring-data-jpa-Specific-and-querydsl /
Tôi sẽ thay thế HashMap bằng một DTO chứa tất cả các tham số nhận tùy chọn, sau đó xây dựng các thông số kỹ thuật dựa trên DTO đó, rõ ràng bạn cũng có thể giữ HashMap và xây dựng thông số kỹ thuật dựa trên nó.
Về cơ bản:
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
}
Và bộ điều khiển:
@RequestMapping(value = "/{ticket}/count", method = RequestMethod.GET)
public long getItemsCount(
@PathVariable String ticket,
VehicleFilter filter,
HttpServletRequest request
) throws Exception
{
return vehicleService.getCount(filter);
}
Dịch vụ:
@Override
public long getCount(VehicleFilter filter)
{
return vehicleRepository.count(filter);
}
Kho lưu trữ:
@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, Integer>, JpaSpecificationExecutor<Vehicle>
{
}
Chỉ cần một ví dụ nhanh được điều chỉnh từ mã công ty, bạn sẽ có ý tưởng!