Consulta HQL - RResolvido

Estou precisando montar esta query

StringBuilder sb = new StringBuilder("SELECT emp FROM EmpresaEntity emp ");
sb.append("WHERE emp.id = :id ");
sb.append("AND emp.entidade = :entidade ");
sb.append("AND Cast(replace(substring(cast(emp.dataInicio As string), 1, 7), '-', '') as Integer) = Cast(:mesAnoas Integer) ");
Query query = entityManager.createQuery(sb.toString());
		query.setParameter("id", entidade.getId());
		query.setParameter("entidade", entidade.getEntidade());
		query.setParameter("mesAno", mesAnoInicio);
		aux = query.getResultList();

Sempre dá este erro: org.hibernate.QueryException: Could not resolve requested type for CAST : Integer

Entendo que não está convertendo para Integer.

Como resolver ?

O que me parece, é que dataInicio é um tipo Integer e, desta maneira, você não pode converter para String.

Não dataInicio é do tipo Timestamp.

Na verdade preciso pegar somente juntos anomes, desta data, por isto converto para String, Replace, para tirar -, ai depois tenho que converter para Inteiro, para validar se é <=.

Se deixo como abaixo, funciona, mas não tem como validar se é <=, com String.

sb.append("AND replace(substring(cast(emp.dataInicio As string), 1, 7), '-', '') = :mesAnoas ");

Faça a transformação depois, afinal, se está como timestamp, é um número (tecnicamente, seria um long representando os segundos a partir de 00:00 de 01/01/1970)

Não entendi.

O que ocorre é que, sendo do tipo timestamp, é um número e não uma data formatada no padrão yyyy-MM-dd,
Esse valor, um long, para ser exato, será lido pelo hibernate, convertido no tipo de data que você tem (seja ele java.util.Date, Calendar ou outra coisa qualquer). Só então que poderá ser transformado conforme você precisa.

Entendi…
Mas neste momento ele já convertei para String ou não ?

sb.append("AND replace(substring(cast(emp.dataInicio As string), 1, 7), ‘-’, ‘’) = :mesAnoas ");, pois usei um cast String

Valores retornados:

emp.dataInicio - TimesTamp
substring(cast(emp.dataInicio As string), 1, 7) = 2017-01
replace(substring(cast(emp.dataInicio As string), 1, 7) , ‘-’, ‘’) = 201701

Depois do replace deveria aceitar o cast int … Isto que não estendi, pois no SQL ele executa

Consegui assim:

SELECT emp FROM EmpresaEntity emp WHERE emp.id = :id AND emp.entidade = :entidade AND month(emp.dataInicio) + year(emp.dataInicio) <= :mesano