Tenho um aplicativo Java que usa um EntityManager para consultar um banco de dados Oracle e preencher uma classe DTO simples.
Isso funciona bem para varchars e strings, mas gera um erro:
Não foi possível determinar a estratégia de instanciação apropriada - nenhum construtor correspondente encontrado e um ou mais argumentos não definiram o alias para bean-injection
assim que tento passar um valor decimal. Tentei fazer o tipo no DTO um Double, double e BigDecimal - mas ainda recebo o erro
Além disso, isso costumava funcionar quando estava sendo executado no Java 8. Tive que atualizar para o Java 17 e ele começou a apresentar o erro.
@PersistenceContext
private EntityManager em;
String hql = "SELECT new my.example.MyDTO(mt.intVal as intVal, mt.decVal as decVal) " +
"FROM MyTable mt " +
"WHERE mt.id = 1234";
TypedQuery<MyDTO> findInsultsQuery = em.createQuery(hql, MyDTO.class);
//Here is where it gets the error - because of the mt.decVal
List<MyDTO> results = findInsultsQuery.getResultList();
Aqui está a classe DTO. Eu também tentei o segundo parâmetro como Double, double, Float e float. Ele sempre lança o erro no matching constructor.
public MyDTO(BigInteger intVal, BigDecimal decVal) {
}
Alguma sugestão?
Recomendo experimentar um deles.
Use o seguinte:
Certifique-se de que os nomes dos parâmetros do construtor correspondam aos aliases na consulta.
Use os tipos de dados corretos no construtor DTO.
Depure os resultados da consulta para verificar os tipos retornados.
Atualize seu provedor JPA para uma versão compatível com Java 17.
Considere usar uma
Tuple
consulta como solução alternativa.