【问题标题】:Lazy loading in only one use case仅在一个用例中延迟加载
【发布时间】:2016-11-07 16:24:46
【问题描述】:

我有一个有很多关系的实体。我无法更改它们,因为在代码的许多部分都使用了映射。

仅在一个用例中,我希望能够仅加载实体而不是它们的关系。

我做了一个这样的简单 CRUDRepository:

public interface EmployeeRepository extends CrudRepository<Employee, UUID> {
  List<Employee> findByCompanyId(UUID companyId);
}

如何在不更改映射注释的情况下加载 Employee 而没有它们的关系?

我试过了:

public interface EmployeeRepository extends CrudRepository<Employee, UUID> {
  List<Employee> findLazyByCompanyId(UUID companyId);
}

这会编译,但实体仍然没有延迟加载。如果没有完成延迟加载,我很惊讶关键字“延迟”被接受。

有什么想法吗?

【问题讨论】:

  • 看起来你可能想要一个抓取计划。

标签: java spring-data


【解决方案1】:

没有简单的方法。可能没有办法完全停止 - 这将取决于您的持久性提供者。这就是为什么大多数时候应该将关系定义为惰性并在需要时急切地加载,而不是相反。

参见,例如:

JPA and eclipselink - Overriding FetchType.Eager

How to override FetchType.EAGER to be lazy at runtime

我所能建议的就是使用构造函数表达式来返回 unmanaged 用户列表。

http://www.objectdb.com/java/jpa/query/jpql/select#Result_Classes_Constructor_Expressions_

或者,更简单地使用 Spring Data 投影来返回数据的子集:

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

public interface EmployeeRepository extends CrudRepository<Employee, UUID> {
  EmployeeSummaryProjection findByCompanyId(UUID companyId);
}

@Projection(name="EmployeeSummaryProjection", types = {Employee.class})
interface EmployeeSummaryProjection{

   /declare methods matching the data you wish to return
}

如果返回的数据是只读的,那么上述任何一种都可能是一种解决方案。

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2017-03-22
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多