[RESOLVIDO] JPQL - distinct

4 respostas
I

Bom dia!

Nesses dias estou apanhando um pouco do JPQL, e mais uma vez conto com a ajuda de vocês.

Preciso colocar um distinct na query.

Li o post indicado pelo Herbert Coelho (http://uaihebert.com/?p=1137) mais mesmo assim não to conseguindo resolver a questão abaixo:

CORRETO - TRAZ TUDO
String jpql = " select new TelemarketingEntity(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk, a.telemarketingPK) " +
" from TelemarketingEntity a, ArquivoEntity b " +
" where a.telemarketingPK.arqnom = b.arquivoPK.arqnom ";

ERRADO - COM DISTINCT
String jpql = " select new TelemarketingEntity(distinct(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk, a.telemarketingPK)) " +
" from TelemarketingEntity a, ArquivoEntity b " +
" where a.telemarketingPK.arqnom = b.arquivoPK.arqnom ";

ERRO: Encontrado "distinct" no caractere 32, mas esperado: ["AVG", "COUNT", "MAX", "MIN", "SUM", ].

@Entity
@Table(name = "FSCMARQ")
public class TelemarketingEntity implements java.io.Serializable {

	private static final long serialVersionUID = -3872221887032117843L;

	private Long arqtipcod;
	private Long arqsitcod;
	private Date arqdat;
	private Date data; 
	private Long qtdeRecebida;
	private Long safra;
	private Long qtdeErro;
	private Long qtdeEnviadaOk;
	
	private String codEmpresa;
		
	private TelemarketingPK telemarketingPK;
			
	public TelemarketingEntity(Date data, Long qtdeRecebida, Long safra,
			Long qtdeErro, Long qtdeEnviadaOk, TelemarketingPK telemarketingPK) {
		super();
		this.data = data;
		this.qtdeRecebida = qtdeRecebida;
		this.safra = safra;
		this.qtdeErro = qtdeErro;
		this.qtdeEnviadaOk = qtdeEnviadaOk;	
		this.telemarketingPK = telemarketingPK;
	}
	
	public TelemarketingEntity(Date data, Long qtdeRecebida, Long safra,
			Long qtdeErro, Long qtdeEnviadaOk, String codEmpresa,
			TelemarketingPK telemarketingPK) {
		super();
		this.data = data;
		this.qtdeRecebida = qtdeRecebida;
		this.safra = safra;
		this.qtdeErro = qtdeErro;
		this.qtdeEnviadaOk = qtdeEnviadaOk;
		this.setCodEmpresa(codEmpresa);
		this.telemarketingPK = telemarketingPK;
	}



	/*public TelemarketingEntity(Date data, Long qtdeRecebida, Long safra,
			Long qtdeErro, Long qtdeEnviadaOk) {
		super();
		this.data = data;
		this.qtdeRecebida = qtdeRecebida;
		this.safra = safra;
		this.qtdeErro = qtdeErro;
		this.qtdeEnviadaOk = qtdeEnviadaOk;	
	}*/	
	
	@EmbeddedId
	public TelemarketingPK getTelemarketingPK() {
		return telemarketingPK;
	}
	public void setTelemarketingPK(TelemarketingPK telemarketingPK) {
		this.telemarketingPK = telemarketingPK;
	}
		
	@Column(name = "arqtipcod")
	public Long getArqtipcod() {
		return arqtipcod;
	}
	public void setArqtipcod(Long arqtipcod) {
		this.arqtipcod = arqtipcod;
	}
	
	@Column(name = "arqsitcod")
	public Long getArqsitcod() {
		return arqsitcod;
	}
	public void setArqsitcod(Long arqsitcod) {
		this.arqsitcod = arqsitcod;
	}
	
	@Column(name = "arqdat")
	public Date getArqdat() {
		return arqdat;
	}
	public void setArqdat(Date arqdat) {
		this.arqdat = arqdat;
	}	
	
	@Column(name = "arqgerdat")
	public Date getData() {
		return data;
	}
	public void setData(Date data) {
		this.data = data;
	}
	
	@Column(name = "arqregqtd")
	public Long getQtdeRecebida() {
		return qtdeRecebida;
	}
	public void setQtdeRecebida(Long qtdeRecebida) {
		this.qtdeRecebida = qtdeRecebida;
	}
	
	@Column(name = "arqlteqtd")
	public Long getSafra() {
		return safra;
	}
	public void setSafra(Long safra) {
		this.safra = safra;
	}
	
	@Column(name = "rcsregqtd")
	public Long getQtdeErro() {
		return qtdeErro;
	}
	public void setQtdeErro(Long qtdeErro) {
		this.qtdeErro = qtdeErro;
	}
	
	@Column(name = "actregqtd")
	public Long getQtdeEnviadaOk() {
		return qtdeEnviadaOk;
	}
	public void setQtdeEnviadaOk(Long qtdeEnviadaOk) {
		this.qtdeEnviadaOk = qtdeEnviadaOk;
	}

	public void setCodEmpresa(String codEmpresa) {
		this.codEmpresa = codEmpresa;
	}

	@Transient
	public String getCodEmpresa() {
		return codEmpresa;
	}

}
@Embeddable
public class TelemarketingPK implements ICompositePrimaryKey {
	
	private static final long serialVersionUID = 6859445788577818752L;
	
	private Long arqcntnum;
	private String arqnom;
	
	public TelemarketingPK() {
		super();
	}	
		
	public TelemarketingPK(Long arqcntnum, String arqnom) {
		super();
		this.arqcntnum = arqcntnum;
		this.arqnom = arqnom;
	}

	@Column(name="arqcntnum")
	public Long getArqcntnum() {
		return arqcntnum;
	}
	public void setArqcntnum(Long arqcntnum) {
		this.arqcntnum = arqcntnum;
	}
	@Column(name="arqnom")
	public String getArqnom() {
		return arqnom;
	}
	public void setArqnom(String arqnom) {
		this.arqnom = arqnom;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((arqcntnum == null) ? 0 : arqcntnum.hashCode());
		result = prime * result + ((arqnom == null) ? 0 : arqnom.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TelemarketingPK other = (TelemarketingPK) obj;
		if (arqcntnum == null) {
			if (other.arqcntnum != null)
				return false;
		} else if (!arqcntnum.equals(other.arqcntnum))
			return false;
		if (arqnom == null) {
			if (other.arqnom != null)
				return false;
		} else if (!arqnom.equals(other.arqnom))
			return false;
		return true;
	}
	
}
Agradeço desde já!

4 Respostas

drsmachado

Veja como o Hebert Coelho montou a query com distinct

Query query = em.createQuery("select distinct p from Person p join p.dogs d where d.weight > :weight");

Veja como você montou a tua query com distinct

String jpql = " select new TelemarketingEntity(distinct(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk, a.telemarketingPK)) " + 
" from TelemarketingEntity a, ArquivoEntity b " + 
" where a.telemarketingPK.arqnom = b.arquivoPK.arqnom ";

Percebeu a diferença?
O distinct não deve ser utilizado da forma como você utilizou. O ideal seria algo como

String jpql = "SELECT distinct te FROM TelemarketingEntity te, ArquivoEntity b " + 
" where te.telemarketingPK.arqnom = b.arquivoPK.arqnom ";

Entendeu?

I

Valeu drsmachado! Irei alterar e testar.

drsmachado

Eu não testei, mas acredito que isso vá funcionar (talvez uma ou outra alteração seja necessária).

I

Consegui resolver. Eu estava colocando o distinct no lugar errado.

CORRETO:

String jpql = " select DISTINCT new TelemarketingEntity(distinct(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk, a.telemarketingPK)) " + " from TelemarketingEntity a, ArquivoEntity b " + " where a.telemarketingPK.arqnom = b.arquivoPK.arqnom ";

Obrigada drsmachado pela atenção!

Criado 24 de abril de 2013
Ultima resposta 24 de abr. de 2013
Respostas 4
Participantes 2