2013-01-04 325 views
3

你好我想查询的JPA一些数据奇怪的错误,这是我的查询:在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(); 
    } 

该查询返回的结果,但下一个异常被触发:

Caused by: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException 
Exception Description: The primary key read from the row [ArrayRecord(
    => 1 
    => 13 
    => 2013-01-04 12:25:00.0 
    => 2013-01-04 12:25:00.0 
    => true 
    => true 
    => true 
    => true 
    => true 
    => true 
    => true)] during the execution of the query was detected to be null. Primary keys must not contain null. 
Query: ReadAllQuery(referenceClass=HorarioAtencion sql="Select * from HorariosAtencion where idPerson = ? AND DAY(fechaInicio) <= ? AND MONTH(fechaInicio) <= ? AND YEAR(fechaInicio) <= ? AND DAY(fechaFin) >= ? AND MONTH(fechaFin) >= ? AND YEAR(fechaFin) >= ? ORDER BY TIME(fechaInicio)") 

我不知道什么可能是问题:/

UPDATE:

对实体类

列定义:

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; 

回答

10

您正在使用什么数据库,它有什么返回的列名?

默认情况下,EclipseLink在较新版本中区分大小写,除非eclipselink.jpa.uppercase-column-names持久属性设置为true。

如果数据库将列名称返回为大写字母"ID",并将其定义为小写字母"id",则可能是本机查询的问题。

尝试更改注释中的列定义以匹配数据库使用的值或将值添加到true值。

1

某处HorariosAtencionnull值在对应于主密钥的字段被发现。

+0

你好!谢谢你的答案,但我的表不包含任何空值 – rafuru

+0

@ rafuru,hm,它很奇怪:在你的查询中你使用了名为'idPerson'的字段,但是在实体类描述中你的字段被称为'idPersona'(见名字中的最后一个'a')。 – Andremoniy

0

...主键从行[ArrayRecord(...

指示HorariosAtencion记录是精细读。有两个ID,两个日期和所有的布尔值。1是大概的ID值。所以,我怀疑异常是指相关Persona实体。是否有Persona s的空的PK?

0

它或者是HorariosAtencion的主键中的一个或多个是空值 /Persona。 仔细检查你的数据库。

或者你需要设置角色ID而不是引用的对象, 尝试

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(); 
} 
5

问题是eclipselink区分大小写。有一个“提示”可以解决这个问题。请将您的属性元素之间以下persistence.xml文件中:

<!-- 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"/> 

这将汤治疗在不区分大小写的方式列名和消除错误。

0

我有同样的问题,我找到了解决办法,尝试从行em.createNativeQuery删除“HorarioAtencion.class。