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

Posted

技术标签:

【中文标题】Spring Boot REST Hibernate - 获取一个国家的所有城市【英文标题】:Spring Boot REST Hibernate - Get all the cities of a country 【发布时间】:2018-10-17 02:38:04 【问题描述】:

使用此代码:

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);

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

【问题讨论】:

【参考方案1】:

您正在尝试从国家/地区协会访问该城市。因此,

@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 数据的优雅方式和力量。无需自定义查询或命名查询。 :)

【讨论】:

【参考方案2】:

假设唯一的要求是获得一个国家的所有城市,我会颠倒你目前对城市->国家的关系。

拥有从国家到城市的 OneToMany 关系,可以让您首先找到感兴趣的国家,然后简单地询问该国家与它关联的所有城市。

【讨论】:

【参考方案3】:

我认为你不应该使用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】:

您可以按照 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

【讨论】:

是的,但是这个,只返回一个城市而不是这个国家所有城市的列表,对吧? @Manu,您可以使用List&lt;City&gt; 获取城市列表。【参考方案5】:

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

所以....

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

 @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 data 方法:

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

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

【讨论】:

以上是关于Spring Boot REST Hibernate - 获取一个国家的所有城市的主要内容,如果未能解决你的问题,请参考以下文章

列出所有已部署的 REST 端点(spring-boot、tomcat)

初入spring boot(八 )Spring Data REST

Spring Boot测试中使用REST Assured(转)

spring boot开发REST接口

Spring Boot 2 Rest Api Example

如何在 Spring(Boot)中装饰 REST 响应?