相关疑难解决方法(0)

一个JPQL查询中的多个连接提取

我有以下实体:

public class Category {
    private Integer id;
    @OneToMany(mappedBy = "parent")
    private List<Topic> topics;
}

public class Topic {
    private Integer id;
    @OneToMany(mappedBy = "parent")
    private List<Posts> posts;
    @ManyToOne
    @JoinColumn(name = "id")
    private Category parent;
}

public class Post {
    private Integer id;
    @ManyToOne
    @JoinColumn(name = "id")
    private Topic parent;
    /* Post fields */
}
Run Code Online (Sandbox Code Playgroud)

我希望使用JPQL查询获取所有已加入主题的类别并加入帖子.我写的查询如下:

SELECT c FROM Category c JOIN FETCH c.topics t JOIN FETCH t.posts p WHERE ...
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Run Code Online (Sandbox Code Playgroud)

我发现了有关此错误的文章,但这些文章仅描述了在一个实体中要加入的两个集合的情况.我的问题有点不同,我不知道如何解决它.

可以在一个查询中执行吗? …

java hibernate jpa join jpql

26
推荐指数
2
解决办法
5万
查看次数

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

我有一个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"中的订单数据,则延迟加载订单不会有帮助我必须另外完全调用相同的用户数据和其他订单数据

java spring jpa spring-data

5
推荐指数
1
解决办法
4173
查看次数

Spring Data JPA,在 CrudRepository 接口中参数化@EntityGraph

Spring Data JPA 是否可以做某事。像这样:

public interface UserDao extends CrudRepository<User, Long> {

@EntityGraph(value = :graphName, type = EntityGraph.EntityGraphType.LOAD)
    @Query(value = "SELECT DISTINCT u FROM User u")
    List<User> findAllWithDetailsByGraphName(@Param(value="graphName") String graphName);

}
Run Code Online (Sandbox Code Playgroud)

能够在运行时将 graphName 传递给方法并使用一组需要的集合调用负载?此构造不起作用,产生编译时错误。任何围绕它的游戏也失败了......

所以,我在 User 类中有多个集合,我想根据条件加载它们;

@Entity
@Table(name="user")
@NamedEntityGraphs({
        @NamedEntityGraph(name = "User.details", attributeNodes = {
                @NamedAttributeNode("phones"), @NamedAttributeNode("emails"), @NamedAttributeNode("pets")}),
        @NamedEntityGraph(name = "User.phones", attributeNodes =
                {@NamedAttributeNode("phones")}),
        @NamedEntityGraph(name = "User.emails", attributeNodes =
                {@NamedAttributeNode("emails")}),
        @NamedEntityGraph(name = "User.pets", attributeNodes =
                {@NamedAttributeNode("pets")})
})
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = …
Run Code Online (Sandbox Code Playgroud)

spring jpa entitygraph

3
推荐指数
1
解决办法
2000
查看次数

标签 统计

jpa ×3

java ×2

spring ×2

entitygraph ×1

hibernate ×1

join ×1

jpql ×1

spring-data ×1