簡體   English   中英

使用count()時,命名參數中的JPA錯誤

[英]JPA error in named parameters wher using count()

嗨,我在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 COUNT有問題?

謝謝!

也許還存在其他問題,但是至少存在以下問題:

跟隨永遠都不是正確的,因為值不能既是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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM