程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Spring Data JPARepository:如何有条件地获取子实体大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Spring Data JPARepository:如何有条件地获取子实体?

开发过程中遇到Spring Data JPARepository:如何有条件地获取子实体的问题如何解决?下面主要结合日常开发的经验,给出你关于Spring Data JPARepository:如何有条件地获取子实体的解决方法建议,希望对你解决Spring Data JPARepository:如何有条件地获取子实体有所启发或帮助;

如果没有调用由getContacts()导致的对象方法,则延迟获取应该正常工作。

如果您希望进行更多的人工工作,并且确实希望对此进行控制(根据使用情况,可能需要更多上下文)。我建议您从帐户实体中删除联系人,并将该帐户映射到联系人中。告诉hibernate状态忽略该字段的一种方法是使用@TransIEnt批注对其进行映射。

@Entity
@table(name = "accounts")
public class Account
{
    protected String accountID;
    protected Collection<Contact> contacts;

    @TransIEnt
    public Collection<Contact> getContacts()
    {
        return contacts;
    }

    //getters & setters

}

然后在服务类中,您可以执行以下操作:

public Account getAccountByID(int accountID, Set<String> fetchPolicy) {
    Account account = accountRepository.findOne(accountID);
    if(fetchPolicy.contains("contacts")){
        account.setContacts(contactRepository.findByAccountID(account.getAccountID());
    }
    return account;
}

希望这是您想要的。顺便说一句,该代码未经测试,因此您可能应该再次检查。

解决方法

除非提供了某个执行参数,否则如何将其JPA实体配置为不获取相关实体。

根据Spring的文档4.3.9。配置Fetch-和LoadGraphs时,您需要使用@EntityGraph批注为查询指定获取策略,但是,这不能让我在运行时决定是否要加载这些实体。

我可以在一个单独的查询中获得子实体,但为此,我需要将自己的存储库或实体配置为不检索任何子实体。不幸的是,我似乎找不到任何有关执行此操作的策略。FetchPolicy将被忽略,并且EntityGraph仅在指定我要热切检索的实体时才有用。

例如,假设假定Account是父项,Contact是子项,并且一个帐户可以有多个联系人。

我希望能够做到这一点:

if(fetchPolicy.contains("contacts")){
  account.setContacts(contactRepository.findByAccountId(account.getAccountId());
}

问题是无论如何弹簧数据都急切地获取联系人。

Account Entity类如下所示:

@Entity
@Table(name = "accounts")
public class Account
{
    protected String accountId;
    protected Collection<Contact> contacts;

    @OneToMany
    //@OneToMany(fetch=FetchType.LAZY) --> doesn't work,Spring Repositories ignore this
    @Joincolumn(name="account_id",referencedcolumnName="account_id")
    public Collection<Contact> getContacts()
    {
        return contacts;
    }

    //getters & setters

}

AccountRepository类如下所示:

publi@R_674_8592@erface AccountRepository extends JpaRepository<Account,String>
{
    //@EntityGraph ... <-- has type= LOAD or FETCH,but neither can Help me prevent retrieval
    Account findOne(String id);
}

大佬总结

以上是大佬教程为你收集整理的Spring Data JPARepository:如何有条件地获取子实体全部内容,希望文章能够帮你解决Spring Data JPARepository:如何有条件地获取子实体所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。