一个实体在表 File 的两个字段中定义了主键,代码如下:
@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。
谢谢。
最佳答案
问题出在数字选择中,因为实体文件有一个带有两个字段的主键,而 EclipseLink(JPA) 至少希望在选择结果中包含主键的两个字段。
我编写的选择仅回答键的两个字段之一的表,因此 JPA 无法构建对象文件。
有关信息,此代码引发了异常:
(List<File>) nativeQuery.getResultList();
在转换为对象 File JPA 时,我说主键为空,因为他只有两个字段之一。
关于java - EclipseLink - 在执行查询期间从行读取的主键被检测为空。主键不能包含 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264374/