У меня есть объект Property, который имеет идентификатор для объекта City. Городской объект, который имеет идентификатор для государственного объекта. И государственная организация, у которой есть идентификатор для страны.
Мне нужно найти все свойства в стране.
Мое решение таково:
protected Specification<Property> createSpecification(PropertyCriteria criteria) {
...
if (criteria.getCountryId() != null) {
StateCriteria stateCriteria = new StateCriteria();
stateCriteria.setCountryId(criteria.getCountryId());
List<StateDTO> states = stateQueryService.findByCriteria(stateCriteria);
List<Long> statesIds = states.stream().map(StateDTO::getId).collect(Collectors.toList());
LongFilter statesInCountry = new LongFilter();
statesInCountry.setIn(statesIds);
CityCriteria cityCriteria = new CityCriteria();
cityCriteria.setStateId(statesInCountry);
List<CityDTO> cities = cityQueryService.findByCriteria(cityCriteria);
List<Long> citiesId = cities.stream().map(CityDTO::getId).collect(Collectors.toList());
LongFilter citiesInState = new LongFilter();
citiesInState.setIn(citiesId);
specification = specification.and(buildSpecification(citiesInState,
root -> root.join(Property_.city, JoinType.LEFT).get(City_.id)));
}
...
}
Есть ли лучшее решение с использованием buildSpecification()
? Мне действительно трудно понять, что в действительности делают функции из QueryService
из-за параметризации типа.
Заранее спасибо!