【问题标题】:Jasper Report: unable to get value for field 'x' of class 'org.postgresql.util.PGmoney'Jasper 报告:无法获取类“org.postgresql.util.PGmoney”的字段“x”的值
【发布时间】:2012-09-04 11:08:57
【问题描述】:

当我需要在 Order 表中检索一些信息时,jasper 无法从 PGmoney 转换为 double。我先google了下,没有这个结果。

你知道怎么解决吗?

注意:我使用的是 PostgreSQL 数据库。

【问题讨论】:

  • 正如您在Monetary Types 中看到的那样,regexp_replace 功能可以帮助您
  • 感谢 Alex K。我修好了
  • 嗨,Alex K,我有一个问题,我使用 hql 语言查询数据,我阅读了您给我的页面,但它告诉我将钱转换为数字然后加倍。但是在 hql 中,我不能转换为数字或双精度(绝对)。当我将其转换为字符串(错误)时。

标签: postgresql jasper-reports


【解决方案1】:

这是 PostgreSQL money 类型 was deprecated and should be avoided 的几个原因之一。奇怪的是 newer versions of the same documentation don't show the deprecation warning 但我 and others 不同意这一点,并认为应该不鼓励使用它。

如果可能,请将您的架构更改为使用numeric,例如numeric(17,2),如果您只想存储整数美分,或者更精确的中间值。在 HQL 中使用 money 时,您会做噩梦,以至于即使是 Java 的 BigDecimal 类(通常用于映射 numeric 字段)也更好,尽管 itw 算术的语法非常笨拙。

如果我是你,我会做一个 ALTER TABLE blah ALTER COLUMN blahcol TYPE numeric(17,2) USING ( regexp_replace(blahcol::text, '[$,]', '', 'g')::numeric ); 并忘记 money 类型的存在。

【讨论】:

  • 您链接到的讨论发生在 2008 年。9.1 版带来了一些改进 - 解决了这些问题。 Add support for dividing money by money (Andy Balholm)Add support for casting between money and numeric (Andy Balholm)Add support for casting from int4 and int8 to money (Joey Adams)。您从 8.2 手册中引用的内容是在 8.3 更改之前:Widen the MONEY data type to 64 bits (D'Arcy Cain) This greatly increases the range of supported MONEY values. 所以,虽然我也会使用 numeric,但我不明白为什么原则上应该避免使用 money
  • @ErwinBrandstetter 啊,在查看演员表等问题时,我不小心回到了旧版本的手册。现在看起来好多了。我仍然看不到money 带来什么优势,但肯定会更好。但是,在使用查询生成器等时,它的格式仍然可能会很痛苦,因为它们通常都是关于最低公分母特征的。
  • 我猜你就在那里。正如我所说,我也会使用numeric。只是为了把事情放在眼里......
  • 所以,我们不应该使用货币类型的要点,对吧?所以我换了其他人,它奏效了。我的问题是,当我在 postgres 中时,我可以通过文本将货币转换为数字。但是在hibernate中,它无法理解。
  • @justin 是的,这是 ORM 的经典之作。他们通常对格式、数据类型等非常严格,但期望数据库对它的期望非常宽松。这两件事都可能是挑战,当通过 ORM 工作时,通常值得坚持相当基本的数据库功能,使用原生查询和存储过程来获得更有趣的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多