如何将@EntityGraph注释分配给Spring Data JPA存储库的.findAll()方法

10

使用@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实体类的摘录:

@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实体类:

@Entity
public class Sysoption implements Serializable {
[...]
    @ManyToOne
    @JoinColumn(name = "optgrp_id", insertable=false, updatable=false)
    private Optgrp optgrp;
}

你是否在你的领域实体上定义了 @NamedEntityGraph(name = "Optgrp.sysoptions", attributeNodes = @NamedAttributeNode("sysoptions")) - Nitin Arora
@NitinArora 是的,NamedEntityGraph被定义在Optgrp领域实体类中。我已经编辑了问题。 - Markus Pscheidt
你能分享一下Sysoption的定义吗? - Nitin Arora
@NitinArora 好的,也添加了Sysoption。 - Markus Pscheidt
2个回答

11

对于那些也将Stack Overflow作为知识库使用的人,我记录了一个新的状态来响应Markus Pscheidts的挑战。三年半之后,@EntityGraph注释现在可以直接在Spring Data的JpaRepositoryfindAll()函数中工作,正如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。


3
迟到总比不来得好 :) - Markus Pscheidt

5
使用名称findByIdNotNull是将findAll()和实体图组合在一起的一种方式:
@EntityGraph(value = "Optgrp.sysoptions")
List<Optgrp> findByIdNotNull();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接