我有一个如下实体:
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();
}
返回MyEntity类的重复行。
{{id:1,名称:'a'rest ...}{id:1,名称:'a'rest ...}
当我尝试获取myEntity.actionList时,出现错误:
org.hibernate.LazyInitializationException:无法延迟初始化角色集合:...
这是因为actionList
导致fetch = FetchType.LAZY
延迟获取。但是您不需要为此使用本机查询。您可以简单地编写一个jpql,在那里您可以急切地获取子列表:
em.createQuery(
"select e " +
"from MyEntity e " +
"left join fetch e.actionList ", MyEntity.class
).getResultList();
当然MyEntity
必须注释为@Entity
。