[RESOLVIDO] Erro em HQL

9 respostas
java
Z

Ola eu tenho a query abaixo, porem estou levando um erro de conversãoinsertion type [org.hibernate.type.IntegerType@45a789bd] and selection type [org.hibernate.type.LongType@7a43fb04]

Query

String hql = "INSERT INTO Logs (quant, erro, serviceId, sla, sys) "
    				+ "SELECT CEILING(COUNT(serviceId)/2) as quant, SUM(erro) as erro, "
    				+ "serviceId, CEILING(AVG(elapsedTime)) as sla, sys "
    				+ "FROM Log WHERE serviceId <> '' GROUP BY serviceId,sys ORDER BY quant "
    				+ "DESC";

Classe Logs e Log são iguais

@Entity
@Table(name="LOGS")
public class Logs {
	
	@Id  
    @Column(name = "ID_LOG", nullable = false, length = 6)
	@GeneratedValue  
    private String idLog; 
	
	/** USERID */
	@Column(name="USERID")
	private String userId;
	
	/** LOGTIMESTAMP */
	@Column(name="LOGTIMESTAMP")
	private String logTimeStamp;
	
	/** ELAPSEDTIME */
	@Column(name="ELAPSEDTIME")
	private String elapsedTime;
	
	/** Quantidade de execuções */
	@Column(name="QUANTIDADE")
	private int quant;
	
	/** Nome do serviço */
	@Column(name="SERVICEID")
	private String serviceId;
	
	/** Nome do serviço */
	@Column(name="SLA")
	private String sla;
	
	/** Sistema que invocou o serviço*/
	@Column(name="SISTEMA")
	private String sys;
	
	/** Quantidade de erros de execução*/
	@Column(name="QUANTIDADE_ERRO")
	private int erro;
	
	/** Identificação do sistema*/
	@Column(name="ID_SISTEMA")
	private int idSistema;
	
	/** Identificação do serviço*/
	@Column(name="ID_SERVICO")
	private int idServico;

	/** Identificação do serviço*/
	@Column(name="EXCHANNEL")
	private String exChannel;
	
	//private Set<SysBean> sistema;
	//private SysBean sigla;
	
	/** Metadata */
	 //@OneToMany(mappedBy = "log", targetEntity = Metadata.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	 //@JoinColumn(name="ID_SERVICO")
	 
	 //@OneToMany(mappedBy = "log", targetEntity = LogMetadata.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	 //@JoinTable(name="METADATA", 
     //joinColumns={@JoinColumn(name="ID_SERVICO")})	 
	 //private List<LogMetadata> metadataList;
	
	public Logs(){}

	public Logs(String idLog, int quant, String serviceId, String sla, String exChannel, String sys, int erro,
			int idSistema, int idServico, List<LogMetadata> metadataList) {
		super();
		this.idLog = idLog;
		this.quant = quant;
		this.serviceId = serviceId;
		this.sla = sla;
		this.sys = sys;
		this.erro = erro;
		this.idSistema = idSistema;
		this.idServico = idServico;
		this.exChannel = exChannel;
		metadataList = metadataList;
	}

	public String getIdLog() {
		return idLog;
	}

	public void setIdLog(String idLog) {
		this.idLog = idLog;
	}

	public int getQuant() {
		return quant;
	}

	public void setQuant(int quant) {
		//this.quant += quant;
		this.quant = quant;
	}

	public String getServiceId() {
		return serviceId;
	}

	public void setServiceId(String serviceId) {
		this.serviceId = serviceId;
	}

	public String getSys() {
		return sys;
	}

	public void setSys(String sys) {
		this.sys = sys;
	}

	public int getErro() {
		return erro;
	}

	public void setErro(int erro) {
		//this.erro += erro;
		this.erro = erro;
	}

	public int getIdSistema() {
		return idSistema;
	}

	public void setIdSistema(int idSistema) {
		this.idSistema = idSistema;
	}

	public int getIdServico() {
		return idServico;
	}

	public void setIdServico(int idServico) {
		this.idServico = idServico;
	}

	public String getExChannel() {
		return exChannel;
	}

	public void setExChannel(String exChannel) {
		this.exChannel = exChannel;
	}
	
	

	public String getSla() {
		return sla;
	}

	public void setSla(String sla) {
		this.sla = sla;
	}

	public void setmetadataList(List<LogMetadata> metadataList) {
		metadataList = metadataList;
	}
	
	
/*
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + erro;
		result = prime * result
				+ ((exChannel == null) ? 0 : exChannel.hashCode());
		result = prime * result + ((idLog == null) ? 0 : idLog.hashCode());
		result = prime * result + idServico;
		result = prime * result + idSistema;
		result = prime * result + quant;
		result = prime * result
				+ ((serviceId == null) ? 0 : serviceId.hashCode());
		result = prime * result + ((sys == null) ? 0 : sys.hashCode());
		return result;
	}
*/
	
	
	
	
	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getLogTimeStamp() {
		return logTimeStamp;
	}

	public void setLogTimeStamp(String logTimeStamp) {
		this.logTimeStamp = logTimeStamp;
	}

	public String getElapsedTime() {
		return elapsedTime;
	}

	public void setElapsedTime(String elapsedTime) {
		this.elapsedTime = elapsedTime;
	}

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

/*	public Set<SysBean> getSistema() {
		return sistema;
	}

	public void setSistema(Set<SysBean> sistema) {
		this.sistema = sistema;
	}
	
	public SysBean getSigla(){return sigla;}
	
	public void setSigla(SysBean sigla){this.sigla=sigla}	
	
	*/

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Logs other = (Logs) obj;
		if (serviceId == null) {
			if (other.serviceId != null)
				return false;
		} else if (!serviceId.equals(other.serviceId))
			return false;
		
		//other.setErro(getErro());
		//other.setQuant(getQuant());
		//other.getSistema().add(getSigla());
		
		return true;
	}


		
	
}

9 Respostas

S

Seu identificador idLog realmente é uma String na base de dados?

Z

Obrigado pelo retorno Samuel. Sim, inclusive eu alterei ele para int na classe e no banco de dados e continua o mesmo erro.

I

Poste o erro que está dando… o que você passou ali acima não é o erro. Procure algo como “Caused by” no log

Z
Caused by: org.hibernate.QueryException: insertion type [org.hibernate.type.IntegerType@c7cc98c] and selection type [org.hibernate.type.LongType@54940cbb] at position 1 are not compatible
	at org.hibernate.hql.internal.ast.tree.IntoClause.validateTypes(IntoClause.java:129)
	at org.hibernate.hql.internal.ast.tree.InsertStatement.validate(InsertStatement.java:53)
	at org.hibernate.hql.internal.ast.HqlSqlWalker.postProcessInsert(HqlSqlWalker.java:785)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.insertStatement(HqlSqlBaseWalker.java:511)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:273)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
	... 9 more
P

O count deve retornar um Long e não um Integer e tens “quant” como Integer na tua entidade.

Z

Obrigado pelo retorno, mas eu não entendi a sua explicação. O erro esta falando justamente disso! A questão é como fazer o cast na hql de long para integer?

I

Ele quis dizer que seu atributo “quant” é int e isso retorna um long “CEILING(COUNT(serviceId)/2)” . Troque o seu atributo quant para long e teste novamente pra ver

Z

Ola obrigado pelo retorno, o erro permanece o mesmo.

Z

Ola eu resolvi o problema colocando “CAST(SUM(l.erro) as integer)” a mensagem no “Caused by” estava indicando a onde esta ocorrendo o erro, o estranho é que a função sum() não deveria retornar um long!

Criado 3 de fevereiro de 2016
Ultima resposta 12 de fev. de 2016
Respostas 9
Participantes 4