[RESOLVIDO] JPQL - distinct

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”, ].

[code]@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;
}

}[/code]

[code]@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;
}

}[/code]Agradeço desde já!

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?

Valeu drsmachado! Irei alterar e testar.

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

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!