Spring 数据 JPA findAll,中间有 table(PropertyReferenceException)
Spring Data JPA findAll with table in between (PropertyReferenceException)
这是我的模型:
一个 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);
}
我该怎么做?
尝试
List< AdmisRejet> findAllAdmisRejetByAdmisHistoryWhereAdmisRejecIsNotNul(AdmisHistory admisHistory);
或类似的东西。
如果我正在阅读正确的规范,这应该可以。
@Query("SELECT DISTINCT ar
FROM AdmisRejet ar
WHERE ar.admis.admisHistory = :history")
List<AdmisRejet> findAdmisRejetByAdmisHistory(AdmisHistory history);
这是我的模型:
一个 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);
}
我该怎么做?
尝试
List< AdmisRejet> findAllAdmisRejetByAdmisHistoryWhereAdmisRejecIsNotNul(AdmisHistory admisHistory);
或类似的东西。
如果我正在阅读正确的规范,这应该可以。
@Query("SELECT DISTINCT ar
FROM AdmisRejet ar
WHERE ar.admis.admisHistory = :history")
List<AdmisRejet> findAdmisRejetByAdmisHistory(AdmisHistory history);