Mysql
 sql >> Base de données >  >> RDS >> Mysql

Java Spring REST API gérant de nombreux paramètres facultatifs

Vous pouvez le faire facilement avec un JpaSpecificationExecutor et une Specification personnalisée :https://spring .io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

Je remplacerais le HashMap par un DTO contenant tous les paramètres get facultatifs, puis je créerais les spécifications basées sur ce DTO, évidemment vous pouvez également conserver le HashMap et construire la spécification basée sur celui-ci.

En gros :

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
}

Et le contrôleur :

@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);
}

Référentiel :

@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, Integer>, JpaSpecificationExecutor<Vehicle>
{
}

Juste un exemple rapide adapté du code de l'entreprise, vous voyez l'idée !