EclipseLink本机查询和FetchType行为

时间:2016-03-04 11:49:55

标签: java jpa orm eclipselink

如果我使用本机查询,我试图理解EclipseLink行为。所以我有这样的实体:

class Entity {

     @OneToOne(fetch = FetchType.LAZY)  
     @JoinColumn(name="other_entity_id")  
     private OtherEntity otherEntity;

     @Column(name = "name")
     private String name;
     //gets ... sets ...
}

和相应的表格如下:

**ENTITY**

INTEGER ID;

VARCHAR NAME;

OTHER_ENTITY_ID;

然后我运行本机查询

Query query = getEntityManager().runNativeQuery("select * from ENTITY", Entity.class);
query.getResultList()

Entity内,我声明了OtherEntity otherEntity,注明了FetchType.LAZY,但是我的查询选择了(*) - 所有列,包括OTHER_ENTITY_ID。问题是 - 如果我运行提取所有列的本机查询,那么注释了FetchType.LAZY的字段是否填充为FetchType.EAGER?我之前从未使用过EclipseLink,并决定是否值得使用它,所以我非常感谢任何帮助

谢谢,干杯

1 个答案:

答案 0 :(得分:0)

我的第一个建议是打开EclipseLink的SQL日志记录,并执行等效的JPQL来加载您要查找的内容,并查看SQL EclipseLink生成的内容,以了解构建对象所需的内容在您的本机查询中,基于您当前的映射。

关系通常使用从外键读入的值加载辅助查询,因此急切或延迟提取不受读入的本机查询的影响"实体" - 无论获取类型如何,查询都需要other_entity_id值。当需要基于eager / lazy加载时,EclipseLink将发出映射所需的查询。

您可以通过标记关系使用joining来更改此设置。在这种情况下,EclipseLink不仅会期望实体值在查询中,还会引用引用的OtherEntity值。