Hibernate 默认为在spring数据jpa中加入子实体的获取
我使用的是spring数据jpa和hibernate 当我获取实体时,会发出多个select语句来获取关系 有没有一种方法可以指示SpringDataJPA在可能的情况下始终使用连接 例如,实体:Hibernate 默认为在spring数据jpa中加入子实体的获取,hibernate,jpa,spring-data,spring-data-jpa,Hibernate,Jpa,Spring Data,Spring Data Jpa,我使用的是spring数据jpa和hibernate 当我获取实体时,会发出多个select语句来获取关系 有没有一种方法可以指示SpringDataJPA在可能的情况下始终使用连接 例如,实体: @Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Temporal(TemporalType.TIMESTAMP)
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Temporal(TemporalType.TIMESTAMP)
private Date ts;
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
private List<Child> child;
}
子关系的获取类型被指定为惰性。指示不加载与父实体的关系。尝试快速获取类型 如果希望fetch类型是惰性的,那么可以通过在Child(Children?)映射上使用@BatchSize来减少语句的数量 Upd: 由于问题是何时提取子实体,实体图应该会有所帮助。声明:
@NamedEntityGraph(
name = "child.withParent",
attributeNodes = {
@NamedAttributeNode("parent")
}
)
并与存储库方法一起使用:
@EntityGraph("child.withParent")
Child findWithParentById(Long id);
似乎不可能…:-(子字段应该是一个集合?@Argb32是的,问题是当我获取子字段时。有2个选择被发出。1个用于子字段,1个用于父字段。似乎这应该是defaultOk的联接。然后需要另一个解决方案。我已更新了答案。感谢您的回复。我知道NamedEntityGraph,但希望我会这样做不必为每个实体定义NamedEntityGraph,而且SpringDataJPA中有一个默认值,但它似乎不是这样。
@EntityGraph("child.withParent")
Child findWithParentById(Long id);