有人可以向我解释为什么JPA支持double
类型作为字段类型,但是javax.validation.constraints
中的bean验证保持不变(即@Min / @Max)不支持吗?
我知道文档说这是由于舍入错误,但如果我选择字段类型为double
,我已经承认我并不关心显式精度。
我遇到这种困境的场景如下:我有一个代表地球表面点的实体。如果精度在几厘米之内就可以了。它看起来像这样:
@Entity
public class Point {
/**
* The longitude in radians.
*/
@Min(-Math.Pi)
@Max(Math.Pi)
double longitude;
/**
* The latitude in radians.
*/
@Min(-Math.Pi / 2)
@Max(Math.Pi / 2)
double latitude;
}
不幸的是,这不起作用,因为注释不支持double类型。但是使用BigDecimal
并不是一个真正的选择,因为我有一些广泛的计算,其中有多个点仍然需要相当快。我通过定义一个与double
一起使用的自定义约束检查来解决这个问题,但不知怎的,我认为整个故事中都缺少一些东西。那么,我错过了什么?
答案 0 :(得分:6)
这是因为四舍五入。但不是因为双重问题可能不够正确以表达您想要的数字。注释值(Min
和Max
)的类型为long,因此它不能用小数位表示任何数字。另一方面,你不能使用双精度来表达长期可以表达的所有数字。
因此API设计者必须决定两种方式之一(长或双)
答案 1 :(得分:0)
使用@DecimalMin
批注。
您将需要传递原义的String值,因为属性value
必须为常数(String.valueOf(-Math.PI))不起作用。
用于验证Double属性。
@DecimalMin(value = "0.01", message = "Your message...")
private Double longitude;