当前位置: 首页 > 知识库问答 >
问题:

Spring数据有条件地获取子级

易元青
2023-03-14

我读过Spring数据JPARepository:如何有条件地获取子实体。但我想使用方便的JPA注释,而不是手动连接所有子级。

假设我有以下型号:

@Entity
public class UserModel extends BaseModel<User> {

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<CredentialModel> credentialList = new ArrayList<>();

    @ManyToMany
    @JoinTable(
            name = "users_actions",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "action_id", referencedColumnName = "id")
    )
    private List<ActionMode> actionList = new ArrayList<>();
}

获取凭据列表(credentialList)和操作列表(actionList)可能是一项耗时的操作(连接获取等)。我不想自动获取凭据列表,也不想自动获取操作列表。但当我访问它们时,我希望它们是一个空列表,而不是懒散的初始化异常。

即使我没有在查询中专门加入FETCH,我也可以使用这些字段吗。让它成为一个空列表。

如果没有,是否有任何方法可以满足同样的需求?

共有2个答案

墨宜人
2023-03-14

我认为您正在尝试执行JOIN而不是FETCH,可能只是在where条件下使用子对象的属性。我想知道像这样的东西在JPQL中会起作用。

@Query("Select u from UserModel u INNER JOIN u.credentialList c
 INNER JOIN u.actionList a")
曾河
2023-03-14

返回空集合将导致一个问题:您无法区分真正的空集合和未延迟加载的集合。您可以在通过组织访问集合之前检查集合。冬眠冬眠I初始化(…) 或PersistenceUnitUtil已加载(…)。

但是,我建议您此时使用数据传输对象。对于不需要集合的特殊用例,只需构建实体的类似副本,而不需要不必要的属性。当然,您的DTO构建必须在开放会话中完成。

 类似资料:
  • 如何将其JPA实体配置为不获取相关实体,除非提供了特定的执行参数。 根据Spring的文件4.3.9。配置Fetch和LoadGraphs时,需要使用EntityGraph注释来指定查询的Fetch策略,但这并不能让我在运行时决定是否要加载这些实体。 我可以在单独的查询中获取子实体,但为了做到这一点,我需要将我的存储库或实体配置为不检索任何子实体。不幸的是,我似乎找不到任何关于如何执行此操作的策略

  • 我试图为父对象创建一个NamedQuery,它从数据库中检索所有可用的父对象,并有条件地在同一个查询中获取一些子对象。例如,查询应该检索所有父对象,并获取每个父对象的年=2012的子对象。不应该获取其余的子对象。我试图用左连接FETCH来玩,但结果是一些父对象也被排除在外。但话说回来,我是FETCH语句的新手。 有没有办法完成上述任务?非常感谢您的帮助。我的父对象的相关代码如下所示:

  • 问题内容: 我想获取基于条件选择的数据帧行数。我尝试了以下代码。 输出: 输出显示数据帧中每一列的计数。相反,我需要获得满足以上所有条件的单一计数?这该怎么做?如果您需要有关我的数据框的更多说明,请告诉我。 问题答案: 您要的是所有条件都为真的条件,所以答案是len,除非我误解了您的要求

  • 我有以下数据帧: 我希望获得行ID,其中。 预期收益为。 有什么想法吗?

  • 问题内容: 我想使用Angular将模型数据表示为不同的图像,但是在找到“正确”的方法时遇到了一些麻烦。表达式的Angular API文档说不允许使用条件表达式… 简化很多,通过AJAX提取模型数据,并向您显示路由器上每个接口的状态。就像是: 因此,在Angular中,我们可以通过以下方式显示每个接口的状态: 但是-我想显示一个合适的图像,而不是模型中的值。遵循这个基本思想的东西。 (我认为Emb

  • 我有以下问题: 我想有条件地显示datatable中的一列。特别是kt数据表中的actions列。(Laravel的Metronic主题有自己的Datatables实现,它基于jQuery Datatables。)我一直在看专栏。渲染方法,但我不能完全理解它。理想情况下,我希望根据与datatable的html一起传递的数据属性显示一列。 HTML: js/jquery: 我真的很感激你的帮助。