2014-03-19 37 views
0

您好,我有mysql的這個簡單的表:JPA錯誤命名參數wher使用count()

+---------------------------------+---------+------+-----+---------+----------------+ 
| 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名錶。 某處在我有這樣的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,有時s是idTipoDocumento,有時是tipo。 我做錯了什麼,或者JPA出現了問題COUNT?

謝謝!

+0

所有你看起來不錯的東西,也許有一個COUNT和JPA的問題。在我的查詢中,我通常不使用COUNT。我將用o替換COUNT(o),然後執行query.getResultList()。size()以獲得計數 –

+0

感謝您的回覆。其實我正在那樣做,但我更喜歡能夠使用計數來表現。 –

+0

啊,那是真的。嗯「從表o選擇計數(o);」在mysql中不起作用,我必須做「從表o選擇計數(*);」 –

回答

1

也許還有別的東西不對,但至少有以下問題:

以下是不正確的,因爲值不可能同時102和103;

o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento //parameter 102 
AND o.idTipoDocumentoOrigen.idTipoDocumento = :idTipoDocumento2 //parameter 103 

JPQL中的COUNT函數返回Long。這就是爲什麼createQuery的第二個參數應該是Long.class。

​​
+0

是的,你是對的,但它是從原來的複製粘貼問題,查詢是正確的代碼。無論如何,如果一個計數查詢中的某個地方從來不是真的,它應該返回0,不會拋出錯誤:) –