我有一个 Java 应用程序,它使用 EntityManager 来查询 Oracle 数据库并填充一个简单的 DTO 类。
这对于 varchar 和字符串来说很好 - 但会引发错误:
无法确定适当的实例化策略 - 未找到匹配的构造函数,并且一个或多个参数未定义 bean 注入的别名
当我尝试传递十进制值时。我尝试将 DTO 中的类型设为 Double、double 和 BigDecimal - 但仍然收到错误
另外 - 当它在 Java 8 上运行时,它曾经有效。我不得不升级到 Java 17,然后它开始抛出错误。
@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();
这是 DTO 类。我还尝试过将第二个参数设为 Double、double、Float 和 float。它总是抛出不匹配的构造函数错误。
public MyDTO(BigInteger intVal, BigDecimal decVal) {
}
有什么建议吗?
我建议尝试一下其中的一个。
使用以下内容:
确保构造函数参数名称与查询中的别名匹配。
在 DTO 构造函数中使用正确的数据类型。
调试查询结果以验证返回的类型。
将您的 JPA 提供程序更新为与 Java 17 兼容的版本。
考虑使用
Tuple
查询作为解决方法。