使用此代码:
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);
}
但是,为了获得一个国家的所有城市?怎么会这样?
答案 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);
}
答案 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);
}