SqlResultSetMapping返回重复行以进行懒惰的读取联接

问题描述 投票:0回答:1

我有一个如下实体:

MyEntity:

public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy = "myEntity", orphanRemoval = true)
    private Set<Action> actionList;
}

而且我有一个@SqlResultSetMapping,如下所示:

            @SqlResultSetMapping(
                    name = "customNativeQuery",
                    entities = {
                            @EntityResult(entityClass= MyEntity.class),
                    }
            ),

然后,我尝试使用以下查询将其映射:

@Override
public List<MyEntity> fetchIt()
{
    StringBuilder sql = new StringBuilder();
    sql.append("Select ")
            .append("e.*, a.* ")
            .append("from ")
            .append("rule e ")
            .append("left join action a on a.my_entity_id = e.id ");

    Query query = em.createNativeQuery(queryBuilder.build(sql), "customNativeQuery");
    return query.getResultList();
}
  1. 返回MyEntity类的重复行。

    {{id:1,名称:'a'rest ...}{id:1,名称:'a'rest ...}

  2. 当我尝试获取myEntity.actionList时,出现错误:

    org.hibernate.LazyInitializationException:无法延迟初始化角色集合:...

hibernate hibernate-mapping native-sql
1个回答
0
投票

这是因为actionList导致fetch = FetchType.LAZY延迟获取。但是您不需要为此使用本机查询。您可以简单地编写一个jpql,在那里您可以急切地获取子列表:

em.createQuery(
"select e " +
"from MyEntity e " +
"left join fetch e.actionList ", MyEntity.class
).getResultList();

当然MyEntity必须注释为@Entity

© www.soinside.com 2019 - 2024. All rights reserved.