Postgresql 货币类型和 java
Postgresql money type and java
我在我的 postgresql 数据库中定义了一个列作为货币类型,假设是总计。
我使用 JAVA 插入数据 JSpinner 使用双模型,插入非常完美,但是当我想获取 select 存储在
总列中的数据时
result.getBigDecimal("total");
我收到一个错误;
org.postgresql.util.PSQLException: Mauvaise valeur pour le type BigDecimal : 0,00 €
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toBigDecimal(AbstractJdbc2ResultSet.java:3012)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:2400)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:355)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:361)
at DAO.BonDachatDAO.findAll(BonDachatDAO.java:42)
at VIEW.BonDeAchatUi.initComponents(BonDeAchatUi.java:255)
at VIEW.BonDeAchatUi.<init>(BonDeAchatUi.java:123)
at VIEW.BonDeAchatUi.run(BonDeAchatUi.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:697)
at java.awt.EventQueue.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我认为问题在于 BigDecimal 不能使用那样的逗号。如果您可以在代码中将其作为字符串获取,请考虑使用
对其进行解析
NumberFormat.getNumberInstance(Locale.FRANCE).parse("0,00")
http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html
如 MONEY documentation page 中所述,如果要访问其数值,则需要在查询中强制转换输出值,如下所示:
select total::numeric, ...
但是,有几个与货币类型相关的问题,最好只使用纯数字来存储金额。
我在我的 postgresql 数据库中定义了一个列作为货币类型,假设是总计。 我使用 JAVA 插入数据 JSpinner 使用双模型,插入非常完美,但是当我想获取 select 存储在
总列中的数据时result.getBigDecimal("total");
我收到一个错误;
org.postgresql.util.PSQLException: Mauvaise valeur pour le type BigDecimal : 0,00 €
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toBigDecimal(AbstractJdbc2ResultSet.java:3012)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:2400)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:355)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBigDecimal(AbstractJdbc2ResultSet.java:361)
at DAO.BonDachatDAO.findAll(BonDachatDAO.java:42)
at VIEW.BonDeAchatUi.initComponents(BonDeAchatUi.java:255)
at VIEW.BonDeAchatUi.<init>(BonDeAchatUi.java:123)
at VIEW.BonDeAchatUi.run(BonDeAchatUi.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:697)
at java.awt.EventQueue.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我认为问题在于 BigDecimal 不能使用那样的逗号。如果您可以在代码中将其作为字符串获取,请考虑使用
对其进行解析NumberFormat.getNumberInstance(Locale.FRANCE).parse("0,00")
http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html
如 MONEY documentation page 中所述,如果要访问其数值,则需要在查询中强制转换输出值,如下所示:
select total::numeric, ...
但是,有几个与货币类型相关的问题,最好只使用纯数字来存储金额。