合并 3 个表并按最后一个搜索
Merging 3 tables and searching by the last
我有一个 属性 实体,它具有城市实体的 ID。
具有 State 实体 ID 的 City 实体。
以及具有 Country 实体 ID 的 State 实体。
我需要找到一个国家的所有财产。
我的解决方案是这个:
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
中的继承函数实际上做了什么。
提前致谢!
要获得 Country
中的所有 Property
,您应该加入实体并将过滤器应用于国家/地区 ID。
protected Specification<Property> createSpecification(PropertyCriteria criteria) {
...
if (criteria.getCountryId() != null) {
specification = specification.and(buildSpecification(criteria.getCountryId(),
root -> root.join(Property_.city, JoinType.LEFT)
.join(City_.state, JoinType.LEFT)
.join(State_.country, JoinType.LEFT)
.get(Country_.id)));
}
...
}
看看这是否满足您的需要。
我有一个 属性 实体,它具有城市实体的 ID。 具有 State 实体 ID 的 City 实体。 以及具有 Country 实体 ID 的 State 实体。
我需要找到一个国家的所有财产。
我的解决方案是这个:
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
中的继承函数实际上做了什么。
提前致谢!
要获得 Country
中的所有 Property
,您应该加入实体并将过滤器应用于国家/地区 ID。
protected Specification<Property> createSpecification(PropertyCriteria criteria) {
...
if (criteria.getCountryId() != null) {
specification = specification.and(buildSpecification(criteria.getCountryId(),
root -> root.join(Property_.city, JoinType.LEFT)
.join(City_.state, JoinType.LEFT)
.join(State_.country, JoinType.LEFT)
.get(Country_.id)));
}
...
}
看看这是否满足您的需要。