使用Spring的JPA EntityGraph有不同的视图

smi*_*ile 5 java spring jpa spring-data

我有一个Spring应用程序.登录后,我正在调用getUserByEmail()方法.

我只需要用户和角色数据.基于角色我将显示不同的视图,每个视图具有不同的数据并且需要User的不同子实体.

好像我必须使用不同的子实体调用getUserByEmail().

这是涉及实体的部分代码:

EntityGraph(value = "withAddresses", type = EntityGraphType.FETCH)
public class User{
  public firstName;
  public lastName;

  @OneToMany(fetch = FetchType.LAZY)
  public List<Address> addresses

  @OneToMany(fetch = FetchType.LAZY)
  public List<Order> orders;             
 }

 public userRepository extend jPaRepository(User.class,Long){
  @EntityGraph(name="withAdresses")
  getUserByEmail(String email)

  /* if possible */
  @EntityGraph(name="withOrder")
  getUserByEmail(String email)
 }
Run Code Online (Sandbox Code Playgroud)
  1. 是否可以有两个具有相同查询名称的User对象图?因为我需要不同视图的不同数据.

  2. 此外,当切换到新视图(弹簧控制器中的新调用)时,先前视图中的事务将被关闭,我必须进行新调用以与用户具有不同的数据.我不明白如果你不在同一个事务服务方法中,fetch lazy如何有用,除非我没有遗漏任何东西.

例如,如果我需要"orderWiew.html"中的订单数据,则延迟加载订单不会有帮助我必须另外完全调用相同的用户数据和其他订单数据

Apo*_*psa 5

仅仅是关于使用多个实体图的消息:在我工作的地方,我们使用了Spring Data可以为查询方法使用多个前缀的事实.我们设置了一个约定,即具有不同前缀的方法具有不同的实体图.因此,例如,findUserByEmail(String)可以使用比readUserByEmail(String)更懒的图形.

不幸的是,我不认为Spring Data支持传递实体图以动态方式使用.但是,您可以实现它并将其添加到您的存储库中.要做到这一点,你应该:

创建一个声明新方法的接口(但不扩展JpaRepository或其他存储库接口)

public interface UserCustomOperations{
    User findUserByEmail(String email, String entityGraph);
}
Run Code Online (Sandbox Code Playgroud)

使您的存储库接口扩展该接口.

public interface UserRepository extends JPaRepository<User,Long>, UserCustomOperations{
    // Not much to do here anymore
}
Run Code Online (Sandbox Code Playgroud)

创建一个在同一个包中实现自定义行为的类,后缀为Impl(默认情况下).

public class  UserRepositoryImpl implements UserCustomOperations{
    public User findUserByEmail(String email, String entityGraph){
        // Inject the EntityManager and execute standard Jpa query with the entity graph set
    }
}
Run Code Online (Sandbox Code Playgroud)