これは、JpaSpecificationExecutor
を使用して簡単に行うことができます。 およびカスタムのSpecification
: https:// spring .io / blog / 2011/04/26 / Advanced-spring-data-jpa-specifications-and-querydsl /
HashMapをすべてのオプションのgetparamsを含むDTOに置き換えてから、そのDTOに基づいて仕様を構築します。もちろん、HashMapを保持し、それに基づいて仕様を構築することもできます。
基本的に:
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
}
そしてコントローラー:
@RequestMapping(value = "/{ticket}/count", method = RequestMethod.GET)
public long getItemsCount(
@PathVariable String ticket,
VehicleFilter filter,
HttpServletRequest request
) throws Exception
{
return vehicleService.getCount(filter);
}
サービス:
@Override
public long getCount(VehicleFilter filter)
{
return vehicleRepository.count(filter);
}
リポジトリ:
@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, Integer>, JpaSpecificationExecutor<Vehicle>
{
}
会社のコードを応用した簡単な例で、アイデアが浮かびます!