Spring Boot REST Hibernate - Получить все города страны - PullRequest
0 голосов
/ 07 мая 2018

С этим кодом:

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 голосов
/ 07 мая 2018

при условии фиксированного размера городов, связанных со страной (для любой страны):

так ....

поскольку вам нужно, чтобы все города были связаны с конкретной страной, просто добавьте двунаправленное отношение один-ко-многим и многие-к-одному между объектами города и страны так что вы можете изменить страну, как показано ниже:

 @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);
}
0 голосов
/ 07 мая 2018

Вы пытаетесь получить доступ к городу из ассоциации страны. Таким образом,

@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. Никаких пользовательских запросов или именованных запросов не требуется. :)

0 голосов
/ 07 мая 2018

Я думаю, вы не должны использовать 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";
}
0 голосов
/ 07 мая 2018

Вы можете попробовать описанный ниже метод согласно официальной документации 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

0 голосов
/ 07 мая 2018

Предполагая, что единственным требованием является получение всех городов страны, я бы перевернул отношения, которые у вас есть в настоящее время для города-> страна.

Наличие отношений OneToMany от страны к городу позволит вам сначала найти интересующую страну, а затем просто запросить эту страну для всех городов, связанных с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...