Сохранение значений Java Double Infinity и NaN в базе данных MS SQL 2008

В нашей бизнес-логике мы должны обрабатывать положительные и отрицательные значения Double.Infinity, а также значения Double.NaN.

Мы должны сохранить эти значения в базе данных Microsoft SQL Server 2008. Проблема в том, что Microsoft SQL Server не поддерживает значения бесконечности или nan.(Описание проблемы для SQL Server 2005 , также применимо для MS SQL Server 2008 ).

Мы используем Hibernate 3.6.7 в качестве реализации JPA и драйвер Microsoft sqljdbc4 версии 4.0.2206.100.

Мы попытались решить эту проблему, установив определение столбца объекта JPA на VARCHAR следующим образом.

@Column(columnDefinition = "VARCHAR(40)")
private Double foo;

Похоже, что это не имеет никакого эффекта, даже несмотря на то, что определение столбца правильно изменено на VARCHAR в базе данных. Кажется, что значение бесконечности обнаружено при проверке драйвера JDBC, поскольку мы получаем следующую трассировку стека при попытке ВСТАВИТЬ Double.Infinityзначение :

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The incoming tabular data  stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 6 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
   ... 79 more

. Любые идеи, как обойти эту проблему, приветствуются.

7
задан Spaideri 8 May 2012 в 07:06
поделиться