Spring Data JPA findAll с таблицей между ними (PropertyReferenceException) - PullRequest
0 голосов
/ 25 октября 2018

Вот моя модель:

  • одна AdmisHistory связана со многими Admis

  • одна Admis связана с 0 или одна AdmisRejet

Сущности:

public class AdmisHistory {
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "admisHistory", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Admis> admis = new ArrayList<>();

public class Admis {
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = ADMIS_HISTORY_ID)
    private AdmisHistory admisHistory;

    @OneToOne(mappedBy = "admis", cascade = CascadeType.ALL)
    private AdmisRejet admisRejet;

public class AdmisRejet {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = ADMIS_ID)
    private Admis admis;

Учитывая AdmisHistory, я хочу получить список AdmisRejet.

Мне удается сделатьэто так:

public interface AdmisRepository extends CrudRepository<Admis, Long> {
    List<Admis> findAllAdmisByAdmisHistory(AdmisHistory admisHistory);
...

// It work llike this:
 admisRepository.findAllAdmisByAdmisHistory(admisHistory)
.stream()
.filter(adm -> adm.getAdmisRejet() != null)

Теперь я хотел бы сделать это простым вызовом в хранилище.Это было бы намного эффективнее и читабельнее.

Примерно так:

 public interface AdmisRejetRepository extends CrudRepository<AdmisRejet, Long> {
        List< AdmisRejet> findAllAdmisRejetByAdmisHistory(AdmisHistory admisHistory);
    }

Но я получаю эту ошибку:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property history found for type Admis! Traversed path: AdmisRejet.admis.'

Я пытаюсь с @Query, носинтаксис не очень хорош:

public interface AdmisRejetRepository extends CrudRepository<AdmisRejet, Long> {
    @Query("SELECT a " +
            "FROM AdmisRejet ar " +
            "LEFT JOIN ar.admis a, " +
            "LEFT JOIN a.admisHistory ah " +
            "WHERE ah = :admisHistory")
    List< AdmisRejet> findAllByHistory(AdmisHistory admisHistory);
}

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Если я читаю спецификации правильно, это должно работать.

@Query("SELECT DISTINCT ar 
        FROM AdmisRejet ar
        WHERE ar.admis.admisHistory = :history")
List<AdmisRejet> findAdmisRejetByAdmisHistory(AdmisHistory history);
0 голосов
/ 25 октября 2018

попробуйте

  List< AdmisRejet> findAllAdmisRejetByAdmisHistoryWhereAdmisRejecIsNotNul(AdmisHistory admisHistory);

или что-то подобное.

...