sql >> Databasteknik >  >> RDS >> Mysql

Java Spring REST API Hanterar många valfria parametrar

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!



  1. Installerar MySQL-python

  2. Postgres - den senaste versionen 0.14.0 av pg gem ger fel

  3. SQLite-kommandon

  4. InnoDB tar över en timme att importera 600MB fil, MyISAM på några minuter