休眠5.0.10 我定义了一个子图,如下所示:
@NamedSubgraph(name = "proc", attributeNodes = {
@NamedAttributeNode("name"),
@NamedAttributeNode("childTable1"),
@NamedAttributeNode("childTable2"),
@NamedAttributeNode("childTable3"),
@NamedAttributeNode("childTable4")
})
问题是,当使用这个子图时,我会返回根表(名称存在的地方)中定义的所有属性,而不仅仅是我指定的子图属性。 有没有办法告诉休眠不获取那些孩子? 我的查询看起来就像
select rec from records rec join rec.proc
@Basic(fetch=LAZY)
并启用字节码增强。从 JPA 角度来看,这些策略并不是强制性要求,因为 LAZY 只是对 JPA 提供者的一个提示。
FetchType.EAGER
关联、使用子实体和 DTO 投影比实体图好得多。
大多数时候,您甚至不需要获取实体,因为仅当您计划修改实体时实体才有意义。否则,DTO 投影始终会更加高效。
如果您有兴趣,我写了一篇关于使用实体模型时可能遇到的所有问题的文章这里。因此,一般来说,如果可能的话,您应该避免这种情况。 您可能想尝试一下Blaze-Persistence Entity Views,这正是它的用例。您可以将目标结构(即 DTO)定义为接口并将属性映射到 JPQL 表达式。这也支持集合等,但适用于 JPQL 级别而不是 SQL 级别。