hibernate:findall方法中的多对一抓取问题

ippsafx7  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(187)

我在获取具有manytone关系的对象列表时遇到了hibernate问题。您可以在下面找到实体和存储库文件。您可以看到portofolio对象有一个基准,它本身就是一个投资组合。
实体

@Entity
//@NamedEntityGraph(name = "Portfolio.benchmark", attributeNodes = @NamedAttributeNode("benchmark"))
@Table(name = "PORTFOLIOS")
public class Portfolio {

    ...

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BENCHMARK_ID", insertable = false, updatable = false)
    private Portfolio benchmark;

    @Column(name = "BENCHMARK_ID")
    private Long benchmarkId;

    ....

}

存储库

@Repository
public interface PortfolioRepository extends CrudRepository<Portfolio, Long> {

    //@EntityGraph(value = "Portfolio.benchmark", type = EntityGraph.EntityGraphType.LOAD)
    //@Query("select portfolio from Portfolio portfolio left join fetch portfolio.benchmark where upper(portfolio.userName) = upper(:userName) ")
    List<Portfolio> findAllByUserNameIgnoreCase(String userName);

}

注解代码是我以前尝试过但不起作用的方法。
情景
我有3个投资组合与以下ID;假设:1,2,3
投资组合1以投资组合id 2为基准,投资组合2以投资组合id 3为基准。
执行存储库方法时 findAllByUserNameIgnoreCase ,我需要为该用户提供一个投资组合列表,其中包含每个基准的信息。
组合1的信息加载正确,但是对于组合2,基准没有加载。
以下是响应的表示:

(Portfolio@20661) = {portfolioId=1, benchmarkId=2, benchmark@20680 = {portfolioId=2, benchmarkId=3, benchmark = null}}
(Portfolio@20680) = Portfolio{portfolioId=2, benchmarkId=3, benchmark = null}
(Portfolio@20698) = Portfolio{portfolioId=3, benchmarkId=null, benchmark = null}

如我们所见,porfolio2有java对象引用20680。投资组合1的基准属性是相同的,是正确的。
我不明白,为什么对于投资组合1,基准关系被提取,对于投资组合2,基准关系不被提取。
我试图配置entitygraph,但没有任何效果。
我做错什么了?调用 findAll 方法?

xxls0lw8

xxls0lw81#

我发现了问题,特别是在屏幕和椅子之间。
问题不在实体或存储库中。它是dto的Map器,在属性上设置了一个空的关系。
对此我很抱歉,非常感谢你对我问题的关注。
干杯

相关问题