简体   繁体   English

Spring Data JPA findAll与介于两者之间的表(PropertyReferenceException)

[英]Spring Data JPA findAll with table in between (PropertyReferenceException)

Here is my model: 这是我的模型:

  • one AdmisHistory is linked to many Admis 一个AdmisHistory链接到许多Admis

  • one Admis is linked to 0 or one AdmisRejet 一个Admis链接到0或一个AdmisRejet

Entities: 实体:

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;

Given an AdmisHistory, I want to retrieve the list of AdmisRejet. 给定一个AdmisHistory,我想检索AdmisRejet的列表。

I manage to do it like this: 我设法做到这一点:

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)

Now I would like to do it in a simple call on a repository. 现在,我想在存储库上的一个简单调用中完成此操作。 It would be much more efficient and readable. 这样会更加高效和可读。

Something like this: 像这样:

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

But I get this error: 但是我得到这个错误:

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

I try with @Query but the syntax is not good: 我尝试使用@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);
}

How can I do it ? 我该怎么做 ?

If I'm reading the spec correct this should work. 如果我阅读的规范正确,那应该可以。

@Query("SELECT DISTINCT ar 
        FROM AdmisRejet ar
        WHERE ar.admis.admisHistory = :history")
List<AdmisRejet> findAdmisRejetByAdmisHistory(AdmisHistory history);

try 尝试

  List< AdmisRejet> findAllAdmisRejetByAdmisHistoryWhereAdmisRejecIsNotNul(AdmisHistory admisHistory);

or something similar. 或类似的东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM