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)
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