gpt4 book ai didi

java - JPA/hibernate + HQL/JPQL : select DTO with BigDecimal parameter

转载 作者:行者123 更新时间:2023-11-29 05:54:21 25 4
gpt4 key购买 nike

我们使用 JPA 和 hibernate 作为实现。假设我有以下 DTO:

public class SupplierInfoDto{
private String supplierName;
private BigDecimal remainingFinances;

public SupplierInfoDto(String supplierName, BigDecimal remainingFinances){
this.supplierName = supplierName;
this.remainingFinances = remainingFinances;
}

// getters / setters
}

我似乎无法 hibernate 以正确找到此构造函数。我首先尝试了以下查询(模型比这更复杂,我最终需要获取一些聚合(不是直接在实体上),这就是我获取 DTO 而不是实体的原因):

SELECT NEW com.company.dto.SupplierInfoDto(s.name, f.remaining)
FROM Supplier s INNER JOIN Finances f
WHERE s.id = :SupplierId

但是,我得到一个 org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class 异常。

我从中选择的 remaining 列在 MSSQL 中存储为 float (我知道,我知道钱永远不应该存储为 float ,但这是一个现有系统,我不能只更改它这个数据类型)..

作为测试,我尝试了以下查询,但出现与上述相同的异常:

SELECT NEW com.company.dto.SupplierInfoDto(s.name, NEW java.math.BigDecimal(10))
FROM Supplier s
WHERE s.id = :SupplierId

所以我的问题是:如何让 hibernate/JPA 为上面的两个查询找到合适的构造函数?

更新:remaining 属性是 Finances 实体上的 double 类型(不是我的决定)。

最佳答案

我不确定为什么 BigDecimal ctor 没有被识别但是你可以重载你的构造函数

如果你有

public SupplierInfoDto(String s, Double d) {
this(s, new BigDecimal(String.valueOf(d)));
}

public SupplierInfoDto(String s, BigDecimal bd) {
//set fields
}

并不是说如果您使用 BigDecimal double 构造函数,数字是基于 double 的,因此仍然会有舍入误差。通常最好使用 BigDecimal string constrctor

例如

new BigDecimal("0.1")

更精确
new BigDecimal(0.1d)

This文章解释了这一点

关于java - JPA/hibernate + HQL/JPQL : select DTO with BigDecimal parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com