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 编组期间的日期对话错误
使用 JPA (Eclipselink) 在 H2 数据库中执行全文搜索