JPA错误:检测到主键为NULL

时间:2014-02-19 12:04:21

标签: java mysql jpa ejb

我在JPA查询具有几何类型列的MySQL表时遇到问题。它包含具有纬度和经度集作为坐标的多边形。在执行na​​tivequery以从表中进行选择时,我收到以下错误

Exception Description: The primary key read from the row [ArrayRecord(
 => POLYGON((102.642944444444 2.9757087270706,102.642944444444 2.79805447470818,....
 => 16.0
 => 325990)] during the execution of the query was detected to be null.  Primary keys must not contain null.

但是,该表没有主键为null的行。此特定行具有非常大的多边形,具有66个坐标。不确定问题是否是因为这个原因。

以下是表列名称和类型

geomarea  - geometry
riskvalue - double
id        - int (Autoincrement, Primary Key)

以下是我的EJB中用于读取表的代码。

Query query = em.createNativeQuery("select astext(geomarea) geomarea,riskvalue,id from earthquakeRisk where Contains(geomarea,GeomFromText('POINT(" + node.getLongitude() + " "+node.getLatitude()+")'))",Earthquakerisk.class);
geomList.addAll(query.getResultList());

以下是字段在实体类中的声明方式

public class Earthquakerisk implements Serializable {
    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @NotNull
    @Lob
    @Column(name = "geomArea")
    private byte[] geomArea;
    @Column(name = "riskvalue")
    private Double riskvalue;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我找到了问题的解决方案。在这里添加它,以防有人发现它有用。

通过从查询中删除Earthquakerisk.class并将我的List更改为List来解决此问题。所以工作代码现在如下。

List<Object[]> geomList = new ArrayList<>();
Query query = em.createNativeQuery("select astext(geomarea) geomarea,riskvalue,id from earthquakeRisk where Contains(geomarea,GeomFromText('POINT(" + node.getLongitude() + " "+node.getLatitude()+")'))");
geomList.addAll(query.getResultList());