您好我正在尝试查询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)")
我不知道可能是什么问题:/
更新:
实体类的列定义:
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;
答案 0 :(得分:10)
您使用的是什么数据库,以及它为列名返回了什么?
默认情况下, EclipseLink 在较新版本中区分大小写,除非eclipselink.jpa.uppercase-column-names
persistent属性设置为true。
如果将列名称定义为小写"ID"
,则数据库将列名返回为大写"id"
时,这可能是本机查询的问题。
尝试更改注释中的列定义以匹配数据库使用的内容,或者将属性添加为值true。
答案 1 :(得分:5)
问题是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"/>
这将以不区分大小写的方式处理列名并消除错误。
答案 2 :(得分:3)
找到此帖子https://forums.oracle.com/thread/614380。
与postgres和EclipseLink有同样的问题。
解决方案: 将主键列更改为大写:
从表格中选择ID 作为&#34; ID&#34; ,field1,field2,...,fieldn
答案 3 :(得分:1)
在HorariosAtencion
表null
值的某个位置找到了与主键对应的字段。
答案 4 :(得分:0)
...从行读取的主键[ArrayRecord(...
表示HorariosAtencion
记录正常。有两个ID,两个日期和所有布尔值。 1
可能是ID值。所以,我怀疑异常是指相关的 Persona
实体。是否有Persona
个空PK?
答案 5 :(得分:0)
在HorariosAtencion的一个/多个主键上有/是空值 /假面。 仔细检查你的数据库。
或者您需要设置角色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();
}
答案 6 :(得分:0)
我有同样的问题,我找到了一个解决方案,尝试从em.createNativeQuery行删除“HorarioAtencion.class。