Spring Boot REST Hibernate - 获取一个国家的所有城市

时间:2018-05-07 10:07:26

标签: java hibernate rest spring-boot jpa

使用此代码:

City.java

@Entity
@Table(name = "cities")
public class City extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Column(name = "name")
    @Size(min = 3, max = 250)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "countryId", nullable = false)
    @JsonIgnore
    private Country country;

    // Getters and Setters
    ...
}

Country.java

@Entity
@Table(name = "countries")
public class Country extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Column(name = "name", unique = true)
    @Size(min = 3, max = 150)
    private String name;

    // Getters and Setters
    ...
}

CityRepository.java

@Repository
public interface CityRepository extends JpaRepository<City, Long> {
}

CountryRepository.java

@Repository
public interface CountryRepository extends JpaRepository<Country, Long> {
}

我需要获取一个国家/地区的所有城市,使用此代码我可以获得所有数据库城市:

CityController.java

@GetMapping("/cities")
public Page<City> getAllCities(Pageable pageable) {
    return cityRepository.findAll(pageable);
}

但是,为了获得一个国家的所有城市?怎么会这样?

5 个答案:

答案 0 :(得分:3)

您正试图通过国家/地区协会访问该城市。因此,

@Repository
public interface CityRepository extends JpaRepository<City, Long> {

List<City> findByCountryName(String name);
Page<City> findByCountryName(String name, Pageable pageable);
List<City> findByCountryId(long id);

}

这将访问国家/地区对象并按国家/地区名称查找。这是优雅的方式和Spring数据的强大功能。无需自定义查询或命名查询。 :)

答案 1 :(得分:1)

您可以按照官方的Spring文档尝试使用以下方法。

@Repository
public interface CityRepository extends JpaRepository<City, Long> {

    public List<City> findByCountryName(String countryName);
}

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

答案 2 :(得分:0)

假设唯一的要求是获得一个国家的所有城市,我会颠倒您目前对city-&gt;国家/地区的关系。

在不同国家/地区之间建立OneToMany关系,可以让您首先找到感兴趣的国家/地区,然后只需向所有与之关联的城市询问该国家/地区。

答案 3 :(得分:0)

我认为你不应该使用findAll。它意味着归还所有人。根据您的要求,您应该使用命名查询,下面是一个示例

public interface CityRepository extends JpaRepository<City, Long> {
    List<City> findAllCity(Pageable pageable);

}

@Entity
@NamedQuery(
    name = City.findAllCity, query = "select * from city where country= ?"
)
public class City{
    public static final String FIND_ALL_CUSTOM = "City.findAllCity";
}

答案 4 :(得分:0)

假设与某个国家/地区相关的城市规模是固定的(对于任何国家/地区):

左右....

因为您需要拥有与特定国家/地区相关的所有城市,然后只需在城市和国家/地区实体之间添加双向一对多和多对一关系 所以你可以改变国家如下:

 @Entity
@Table(name = "countries")
public class Country extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Column(name = "name", unique = true)
    @Size(min = 3, max = 150)
    private String name;

    @OneToMany(fetch = FetchType.LAZY,mappedBy = "country",nullable = false)
    private Set<City> cities ;

    // Getters and Setters
...
}

但是如果citeis的大小没有修复并且它是一个很大的列表(出于性能原因),你应该尝试这样的spring数据方法:

@Repository
public interface CityRepository extends JpaRepository<City, Long> {

    Page<City> findByCountry(Country country, Pageable pageable);
}