嗨,我在mysql中有这个简单的表:
+---------------------------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------------+---------+------+-----+---------+----------------+
| id_documento_referencia_importa | int(11) | NO | PRI | NULL | auto_increment |
| id_tipo_documento | int(11) | NO | MUL | NULL | |
| tipo | char(1) | NO | MUL | NULL | |
| id_tipo_documento_origen | int(11) | NO | MUL | NULL | |
| estado_documento_origen_antes | char(1) | YES | MUL | NULL | |
| estado_documento_origen_despues | char(1) | YES | MUL | NULL | |
+---------------------------------+---------+------+-----+---------+----------------+
和这个实体:
public class DocumentoReferenciaImporta implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_documento_referencia_importa")
private Integer idDocumentoReferenciaImporta;
@Basic(optional = false)
@NotNull
@Column(name = "tipo")
private char tipo;
@JoinColumn(name = "estado_documento_origen_despues", referencedColumnName = "estado_documento")
@ManyToOne
private EstadoDocumento estadoDocumentoOrigenDespues;
@JoinColumn(name = "estado_documento_origen_antes", referencedColumnName = "estado_documento")
@ManyToOne
private EstadoDocumento estadoDocumentoOrigenAntes;
@JoinColumn(name = "id_tipo_documento_origen", referencedColumnName = "id_tipo_documento")
@ManyToOne(optional = false)
private TipoDocumento idTipoDocumentoOrigen;
@JoinColumn(name = "id_tipo_documento", referencedColumnName = "id_tipo_documento")
@ManyToOne(optional = false)
private TipoDocumento idTipoDocumento;
[...snip...]
表引用另一个表id_tipo_documento,这是一个简单的id-name表。 代码中的某个地方我有这个JPA查询,它运行得很好:
String jpql="SELECT o FROM DocumentoReferenciaImporta o "
+ "WHERE o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento "
+ "AND o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento2 "
+ "AND o.tipo = :tipo";
Query query = em.createQuery(jpql, DocumentoReferenciaImporta.class);
query.setParameter("idTipoDocumento",102);
query.setParameter("idTipoDocumento2", 103);
query.setParameter("tipo",'R');
query.getResultList();
在另一个函数中,我需要计算记录,所以我这样做:
String jpql="SELECT COUNT(o) FROM DocumentoReferenciaImporta o "
+ "WHERE o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento "
+ "AND o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento2 "
+ "AND o.tipo = :tipo";
Query query = em.createQuery(jpql, DocumentoReferenciaImporta.class);
query.setParameter("idTipoDocumento",102);
query.setParameter("idTipoDocumento2", 103);
query.setParameter("tipo",'R');
query.getResultList();
int count = ((Integer)q.getSingleResult()).intValue();
此查询会给我一个错误,如:
java.lang.IllegalStateException: Query argument idTipoDocumento2 not found in the list of parameters provided during query execution.
此外,每个应用程序部署都会导致不同的错误:有时导致错误的参数是idTipoDocumento2,有时是idTipoDocumento,有时候是tipo。 我做错了什么或JPA有问题吗?
谢谢!
答案 0 :(得分:1)
也许还有其他问题,但至少存在以下问题:
以下情况永远不会成立,因为价值不能同时为102和103;
o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento //parameter 102
AND o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento2 //parameter 103
JPQL中的COUNT函数返回Long。这就是为什么createQuery的第二个参数应该是Long.class。
Query query = em.createQuery(jpql, Long.class);