在MySQL中存储Double.POSITIVE_INFINITY(EJB实体/JBoss)
我有以下简单的 JPA 实体:
@Entity
@Table( name = myentity_table )
public class MyEntity {
private double a;
private double b;
//(...)
}
a 和 b 可以设置为 Double.POSITIVE_INFINITY
。当我尝试使用标准实体管理器将双重设置为 +INF 的实体存储到数据库(MySQL)中时,出现异常:
java.sql.SQLException:“Infinity”不是有效的数值或近似数值
据我所知 MySQL 可能不支持 NaN/-INF/+INF 数字。有没有什么方法可以存储这个实体,而无需编写 HQL 查询并将 +INF 转换为 null (或 max double)?理想情况下,我想像往常一样通过实体管理器来完成此操作。
提前致谢。
I have the following simple JPA entity:
@Entity
@Table( name = myentity_table )
public class MyEntity {
private double a;
private double b;
//(...)
}
a and b may be set to Double.POSITIVE_INFINITY
. When I try to store entity with double set to +INF into database (MySQL) using standard entity manager I get exception:
java.sql.SQLException: 'Infinity' is not a valid numeric or approximate numeric value
As far as I know MySQL may not support NaN/-INF/+INF numbers. Is there any way to store this entity without writing HQL queries and translating +INF into null (or max double) ? Ideally, I'd like to do it via entity manager as usual.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里可以使用实体生命周期回调方法@PrePersist、@PreUpdate来验证字段值NAN/-INF/+INF等&然后相应地设置默认值。
Entity life-cycle callback methods @PrePersist, @PreUpdate can be used here to verify the field value NAN/-INF/+INF etc & then setting the default value accordingly.
MySQL似乎不支持“无穷大”。 这篇文章写道:
积极的情况也是如此。 其他资源也使用
1e500
。我建议您不要使用无穷大,而是使用
Float.MAX_VALUE
和Float.MIN_VALUE
(或Double
等效项)如果您不能这样做在您的代码中设置值时,请按照已经建议的那样在
@PrePersist
中执行此操作。MySQL doesn't seem to support "infinity". This article writes that:
Same goes for positive. Other resources also use
1e500
.Instead of using infinity, I would suggest that you use
Float.MAX_VALUE
andFloat.MIN_VALUE
(orDouble
equivalents)If you can't do this in your code when setting the values, do it in a
@PrePersist
as already suggested.我通过添加一个 varchar 列来存储
Float.NaN
、Float.POSITIVE_INFINITY
和Float.NEGATIVE_INFINITY
的文本表示来解决这个问题,而原始的列将存储NULL
。然后我使用 setter 和 getter 来管理这两列。
在我的 @Entity 类
结果中:
I managed this problem by adding a varchar column to store the text representation of
Float.NaN
,Float.POSITIVE_INFINITY
andFloat.NEGATIVE_INFINITY
while the original column will storeNULL
.Then I use the setter and the getter to do manage those two columns.
In my @Entity class
Result :