在使用JPA findOne和AlternityGraph时,OneToMany集合不完整

9rbhqvlz  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(106)

在从Spring-Boot:2.7.4迁移到Spring-Boot:3.0.9的过程中,我注意到EntityGraphJpaSpecificationExecutor.findOne(Specification<T> spec, EntityGraph entityGraph)没有完全解决OneToMany集合。
在spring-boot:2.7.4中,这一点运行得很好。我在迁移说明中找不到关于这个问题的任何信息。
这可以在小演示中看到。当调用findOne(with(authorId), entityGraph)时,并不是所有的书都为作者解析-测试将失败。
我希望所有延迟获取的OneToMany细节都能得到解决。
你可以在这里找到小演示:https://github.com/da-von/spring-boot-jpa-findOne
当记录生成的SQL查询时,可以看到left joinfetch first ? rows only限制相结合。这对我来说似乎没有意义,因为QuestityGraph可以是动态的,并且结果也必须完全解析为依赖细节。

select a1_0.id,b1_0.author_id,b1_0.id,b1_0.genre,b1_0.isbn,b1_0.title,a1_0.name 
  from author a1_0 
      left join book b1_0 on a1_0.id=b1_0.author_id 
  where a1_0.id=? 
  fetch first ? rows only

字符串

  • 本地机器:MacBook Pro,macOS Ventura:13.4.1
  • java:17本地现有虚拟机temurin-17.jdk
  • spring-boot:3.0.9
  • com.cosium.spring.data:spring-data-jpa-entity-graph:3.0.1
  • Docker镜像中的Postgres Postgres:13-alpine
syqv5f0l

syqv5f0l1#

已解决!具有以下功能的存储库接口:

@NoRepositoryBean
public interface OverrideEntityGraphSimpleJpaRepository<T, ID> extends JpaRepository<T, ID>, EntityGraphPagingAndSortingRepository<T, ID>, EntityGraphJpaSpecificationExecutor<T> {

    @Override
    default Optional<T> findOne(Specification<T> spec) {
        return findOne(spec, (EntityGraph) null);
    }

    @Override
    default Optional<T> findOne(Specification<T> spec, EntityGraph entityGraph) {
        val items = findAll(spec, entityGraph);

        if (items.size() > 1) {
            throw new IncorrectResultSizeDataAccessException(1);
        }
        if (items.size() == 1) {
            return Optional.of(items.get(0));
        }
        return Optional.empty();
    }
}

字符串
AuthorRepository和BookRepository扩展了这个接口,执行被覆盖的findOne(...)变体:

public interface AuthorRepository extends OverrideEntityGraphSimpleJpaRepository<Author, Long>,
        EntityGraphJpaSpecificationExecutor<Author> {

    default Optional<Author> findOne(long id, EntityGraph entityGraph) {
        return findOne(
                  (a, cb, cq) -> cq.equal(a.get(Author_.id), id), 
                   entityGraph
        );
    } 

    // other detail ommitted

}


解决方案提交到示例存储库https://github.com/Cosium/spring-data-jpa-entity-graph

相关问题