合并3个表并在最后搜索

问题描述 投票:1回答:1

我有一个Property实体,其ID为City实体。具有州实体ID的城市实体。还有具有国家实体ID的州实体。

我需要找到一个国家的所有财产。

我的解决方案是这个:

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的内在函数实际上是做什么的。

提前感谢!

filtering jhipster
1个回答
0
投票

要获得Property中的所有Country,您应该加入实体并将过滤器应用于国家/地区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)));
    }
    ...
}

看看这是否满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.