如何将 @EntityGraph 注释分配给 Spring Data JPA 存储库 .findAll()
How to assign an @EntityGraph annotation to Spring Data JPA repository .findAll()
用 @EntityGraph
:
注释 Spring Data JPA 存储库方法 findAll()
import org.springframework.data.jpa.repository.JpaRepository;
[...]
public interface OptgrpRepository extends JpaRepository<Optgrp> {
@EntityGraph(value = "Optgrp.sysoptions")
List<Optgrp> findAll();
}
导致此错误消息:
org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type Optgrp!
将 findAll()
更改为其他名称时发生相同的错误:
findAllWithDetail()
--> No property findAllWithDetail found for type Optgrp!
findWithDetailAll()
--> No property findWithDetailAll found for type Optgrp!
问题:是否可以在查找所有实体的 Spring Data JPA 存储库方法上使用 @EntityGraph
注释?
编辑:如评论中所述,这是 Optgrp
实体 class:
的摘录
@Entity
@NamedEntityGraph(name = "Optgrp.sysoptions", attributeNodes = @NamedAttributeNode("sysoptions"))
public class Optgrp implements Serializable {
[...]
@OneToMany(mappedBy="optgrp", cascade = CascadeType.ALL, orphanRemoval=true)
@OrderBy(clause = "ordnr ASC")
private List<Sysoption> sysoptions = new ArrayList<>();
}
还有 Sysoption
实体 class:
@Entity
public class Sysoption implements Serializable {
[...]
@ManyToOne
@JoinColumn(name = "optgrp_id", insertable=false, updatable=false)
private Optgrp optgrp;
}
使用名称 findByIdNotNull
是结合 findAll() 和实体图的一种方法:
@EntityGraph(value = "Optgrp.sysoptions")
List<Optgrp> findByIdNotNull();
对于所有也使用 Stack Overflow 作为知识数据库的人,我记录了 Markus Pscheidts 挑战的新状态。三年零六个月后,@EntityGraph
注释现在直接在 Spring 数据 JpaRepository
中的 findAll()
函数中工作,正如 Markus 最初预期的那样。
@Repository
public interface ImportMovieDAO extends JpaRepository<ImportMovie, Long> {
@NotNull
@Override
@EntityGraph(value = "graph.ImportMovie.videoPaths")
List<ImportMovie> findAll();
}
测试中使用的版本:Spring Boot 2.0.3.RELEASE 包含 spring-boot-starter-data-jpa.
用 @EntityGraph
:
findAll()
import org.springframework.data.jpa.repository.JpaRepository;
[...]
public interface OptgrpRepository extends JpaRepository<Optgrp> {
@EntityGraph(value = "Optgrp.sysoptions")
List<Optgrp> findAll();
}
导致此错误消息:
org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type Optgrp!
将 findAll()
更改为其他名称时发生相同的错误:
findAllWithDetail()
--> No property findAllWithDetail found for type Optgrp!
findWithDetailAll()
--> No property findWithDetailAll found for type Optgrp!
问题:是否可以在查找所有实体的 Spring Data JPA 存储库方法上使用 @EntityGraph
注释?
编辑:如评论中所述,这是 Optgrp
实体 class:
@Entity
@NamedEntityGraph(name = "Optgrp.sysoptions", attributeNodes = @NamedAttributeNode("sysoptions"))
public class Optgrp implements Serializable {
[...]
@OneToMany(mappedBy="optgrp", cascade = CascadeType.ALL, orphanRemoval=true)
@OrderBy(clause = "ordnr ASC")
private List<Sysoption> sysoptions = new ArrayList<>();
}
还有 Sysoption
实体 class:
@Entity
public class Sysoption implements Serializable {
[...]
@ManyToOne
@JoinColumn(name = "optgrp_id", insertable=false, updatable=false)
private Optgrp optgrp;
}
使用名称 findByIdNotNull
是结合 findAll() 和实体图的一种方法:
@EntityGraph(value = "Optgrp.sysoptions")
List<Optgrp> findByIdNotNull();
对于所有也使用 Stack Overflow 作为知识数据库的人,我记录了 Markus Pscheidts 挑战的新状态。三年零六个月后,@EntityGraph
注释现在直接在 Spring 数据 JpaRepository
中的 findAll()
函数中工作,正如 Markus 最初预期的那样。
@Repository
public interface ImportMovieDAO extends JpaRepository<ImportMovie, Long> {
@NotNull
@Override
@EntityGraph(value = "graph.ImportMovie.videoPaths")
List<ImportMovie> findAll();
}
测试中使用的版本:Spring Boot 2.0.3.RELEASE 包含 spring-boot-starter-data-jpa.