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<City>
获取城市列表。【参考方案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(转)