EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null

Posted

技术标签:

【中文标题】EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null【英文标题】:EclipseLink - The primary key read from the row during the execution of the query was detected to be null. Primary keys must not contain null 【发布时间】:2016-10-26 14:01:46 【问题描述】:

一个实体在表文件的两个字段中定义了一个主键,代码如下:

@Id
@Column(name = "\"ID_ORGANIZATION\"")
private java.math.BigInteger idOrganization;
@Id
@Column(name = "\"Id\"")
private java.math.BigInteger id;

这是查询:

"SELECT "Id","FileName" FROM "File" WHERE "Id" IN (SELECT "IdFile" FROM "DocumentFile" WHERE "IdDocument"=? AND ID_ORGANIZATION=?) AND ID_ORGANIZATION=? ORDER BY "Id""

假设参数正确且值正确 - 这是异常接收“从行中读取的主键 [ArrayRecord( 文件.Id => 10228 File.FileName => 000350.pdf)] 在执行查询期间被检测为空。主键不能包含 null。”

可以看到文件实体的主键字段不为空(File.Id => 10228)。在数据库中,该表没有任何主键字段为空(显然)。

我只是尝试在配置文件中设置参数“eclipselink.jpa.uppercase-column-names”=true 还是不行。

我使用的是 Apache Tomcat 8、Java 8 和 SqlServer 14。Eclipselink 版本是 2.4.0,JPA 版本是 2.0.4。

谢谢。

【问题讨论】:

为什么它在结果集中显示为“File.Id”而不是“Id”?它们不匹配,这可能是它找不到“Id”字段的原因 【参考方案1】:

问题出在数字选择中,因为实体文件有一个包含两个字段的主键,而 EclipseLink(JPA) 至少希望在选择结果中包含主键的两个字段。

我写的选择只回答键的两个字段之一的表,因此 JPA 无法构建对象文件。

有关信息,此代码引发了异常:

(List<File>) nativeQuery.getResultList();

在对象文件 JPA 的强制转换中,我说主键为空,因为他只有两个字段之一。

【讨论】:

以上是关于EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 eclipselink 在 JPA 对象上进行 jaxb 编组期间的日期对话错误

EclipseLink 错误?简单的原生 SQL 查询异常

使用 JPA (Eclipselink) 在 H2 数据库中执行全文搜索

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

oracle--------一致性读