EclipseLink 原生查询和 FetchType 行为

Posted

技术标签:

【中文标题】EclipseLink 原生查询和 FetchType 行为【英文标题】:EclipseLink native query and FetchType behaviour 【发布时间】:2016-03-04 11:49:55 【问题描述】:

如果我使用本机查询,我正在尝试了解 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】:

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

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

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

【讨论】:

以上是关于EclipseLink 原生查询和 FetchType 行为的主要内容,如果未能解决你的问题,请参考以下文章

从子句中的jpa eclipselink子查询

EclipseLink-6015 表达式中的查询键 [客户] 无效

JAVA EclipseLink可选查询参数

EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体

使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为

使用 IN 语句的 Eclipselink JPA 类型安全查询