Jpa org.eclipse.persistence.exceptions.QueryException:在执行查询期间从行读取的主键被检测为null

Jpa org.eclipse.persistence.exceptions.QueryException:在执行查询期间从行读取的主键被检测为null,jpa,eclipselink,primary-key,Jpa,Eclipselink,Primary Key,我正在尝试查询JPA的一些数据,以下是我的查询: @Override public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) { Query busqueda = em.createNativeQuery("Select * from HorariosAtencion where " +

我正在尝试查询JPA的一些数据,以下是我的查询:

@Override
    public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
        Query busqueda = em.createNativeQuery("Select * from HorariosAtencion where " +
                                              "idPerson = ?1 AND "+
                                              "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                              "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
       busqueda.setParameter(1,person.getId());
       busqueda.setParameter(2, dia);
       busqueda.setParameter(3, mes);
       busqueda.setParameter(4, anno);
       return busqueda.getResultList();
    }

HorariosAtencion
表的某个地方,在与主键对应的字段中找到了
null

…从行[ArrayRecord(


表示
horariosatenction
记录没有问题。有两个ID、两个日期和所有布尔值。
1
可能是ID值。因此,我怀疑异常指的是相关的
Persona
实体。是否存在PKs为空的
Persona
s?

您使用的是什么数据库,它返回什么关于列名

默认情况下,EclipseLink在较新版本中区分大小写,除非
EclipseLink.jpa.uppercase列名
persistent属性设置为true

如果将列名定义为小写的
“ID”
时,数据库返回的列名为大写的
“ID”
,则本机查询可能会出现问题


尝试更改批注中的列定义以匹配数据库使用的内容,或添加值为true的属性。

可能是HorarioSatension的一个或多个主键上存在空值 /人物角色。 仔细检查你的数据库

或者您需要设置角色id而不是引用对象, 试一试

公共列表findByPeriodo(个人、国际直径、国际人工、国际人工){
Query busqueda=em.createQuery(“从何处开始”+
“idPerson=?1和”+
“天(费切尼西奥)=?4个时间顺序(费切尼西奥)”,HorarioAtencion.class);
busqueda.setParameter(1人);
设置参数(2,直径);
设置参数(3,mes);
设置参数(4,anno);
返回busqueda.getResultList();
}

公共列表findByPeriodo(个人、国际直径、国际人工、国际人工){
Query busqueda=em.createNativeQuery(“从何处选择*”+
“**idPerson.id**=?1和”+
“天(费切尼西奥)=?4个时间顺序(费切尼西奥)”,HorarioAtencion.class);
setParameter(1,person.getId());
设置参数(2,直径);
设置参数(3,mes);
设置参数(4,anno);
返回busqueda.getResultList();
}
找到了此线程

对postgres和EclipseLink也有同样的问题

解决方案: 将主键列更改为大写,即:


从表中选择id作为“id”,field1,field2,…,fieldn…

问题在于eclipselink区分大小写。有一个“提示”可以解决这个问题。请在persistence.xml文件中的properties元素之间放置以下内容:

<!-- Hint to solve "The primary key read from the row [DatabaseRecord(...)] during the execution of the query was detected to be null." errors.-->
<property name="eclipselink.jpa.uppercase-column-names" value="true"/>


这将以不区分大小写的方式处理列名并消除错误。

我也遇到了同样的问题,我找到了一个解决方案,尝试删除“em.createNativeQuery行中的HorarioAtencion.class.

Hi!感谢您的回答,但我的表中不包含任何空值。”value@rafuru,hm,这很奇怪:在查询中,您使用名为
idPerson
的字段,但在实体类描述中,您的字段名为
idPersona
(请参见名称中的最后一个
a
).这不是个错误吗?
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @Column(name = "fechaInicio")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaInicio;

    @Basic(optional = false)
    @Column(name = "fechaFin")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaFin;

    @Basic(optional = false)
    @Column(name = "domingo")
    private boolean domingo;

    @Basic(optional = false)
    @Column(name = "lunes")
    private boolean lunes;

    @Basic(optional = false)
    @Column(name = "martes")
    private boolean martes;

    @Basic(optional = false)
    @Column(name = "miercoles")
    private boolean miercoles;

    @Basic(optional = false)
    @Column(name = "jueves")
    private boolean jueves;

    @Basic(optional = false)
    @Column(name = "viernes")
    private boolean viernes;

    @Basic(optional = false)
    @Column(name = "sabado")
    private boolean sabado;

    @JoinColumn(name = "idPersona", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Persona idPersona;
public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
    Query busqueda = em.createQuery("from HorariosAtencion where " +
                                          "idPerson = ?1 AND "+
                                          "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                          "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
   busqueda.setParameter(1,person);
   busqueda.setParameter(2, dia);
   busqueda.setParameter(3, mes);
   busqueda.setParameter(4, anno);
   return busqueda.getResultList();
}
public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
    Query busqueda = em.createNativeQuery("Select * from HorariosAtencion where " +
                                          "**idPerson.id** = ?1 AND "+
                                          "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                          "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
   busqueda.setParameter(1,person.getId());
   busqueda.setParameter(2, dia);
   busqueda.setParameter(3, mes);
   busqueda.setParameter(4, anno);
   return busqueda.getResultList();
}
<!-- Hint to solve "The primary key read from the row [DatabaseRecord(...)] during the execution of the query was detected to be null." errors.-->
<property name="eclipselink.jpa.uppercase-column-names" value="true"/>