Du kan göra detta enkelt med en JpaSpecificationExecutor
och en anpassad Specification
:https://spring .io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
Jag skulle ersätta HashMap med en DTO som innehåller alla valfria get params, sedan bygga specifikationerna baserat på den DTO, självklart kan du också behålla HashMap och bygga specifikationen baserat på den.
I grund och botten:
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
}
Och styrenheten:
@RequestMapping(value = "/{ticket}/count", method = RequestMethod.GET)
public long getItemsCount(
@PathVariable String ticket,
VehicleFilter filter,
HttpServletRequest request
) throws Exception
{
return vehicleService.getCount(filter);
}
Service:
@Override
public long getCount(VehicleFilter filter)
{
return vehicleRepository.count(filter);
}
Förvar:
@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, Integer>, JpaSpecificationExecutor<Vehicle>
{
}
Bara ett snabbt exempel anpassat från företagskod, du fattar!