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 行为的主要内容,如果未能解决你的问题,请参考以下文章
EclipseLink-6015 表达式中的查询键 [客户] 无效
EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体