昨天用JPA写报表的SQL,在执行的时候一直报 “数据类型不一致: 应为 NUMBER, 但却获得 BINARY” 的错误,一开始我还不知道Oracle的数据类型和Java对应类型有所不同,逐行检查我的SQL,查看是哪段类型出了问题。
后面检查发现是下面这行语句出现了问题。
AND (ro.is_included_commission = ?35 OR ?35 IS NULL)
查了数据表中的这个is_included_commission字段类型,就是NUMBER类型,于是换了Integer类型,但是依旧报 “数据类型不一致: 应为 NUMBER, 但却获得 BINARY” 的错误,然后还特地去网上搜索了Oracle数据库类型对应java类型。
引用地址:http://blog.csdn.net/perny/article/details/7971003
SQL数据类型 | JDBC类型代码 | 标准的Java类型 | Oracle扩展的Java类型 |
---|---|---|---|
CHAR | java.sql.Types.CHAR | java.lang.String | oracle.sql.CHAR |
VARCHAR2 | java.sql.Types.VARCHAR | java.lang.String | oracle.sql.CHAR |
LONG | java.sql.Types.LONGVARCHAR | java.lang.String | oracle.sql.CHAR |
NUMBER | java.sql.Types.NUMERIC | java.math.BigDecimal | oracle.sql.NUMBER |
NUMBER | java.sql.Types.DECIMAL | java.math.BigDecimal | oracle.sql.NUMBER |
NUMBER | java.sql.Types.BIT | boolean | oracle.sql.NUMBER |
NUMBER | java.sql.Types.TINYINT | byte | oracle.sql.NUMBER |
NUMBER | java.sql.Types.SMALLINT | short | oracle.sql.NUMBER |
NUMBER | java.sql.Types.INTEGER | int | oracle.sql.NUMBER |
NUMBER | java.sql.Types.BIGINT | long | oracle.sql.NUMBER |
NUMBER | java.sql.Types.REAL | float | oracle.sql.NUMBER |
NUMBER | java.sql.Types.FLOAT | double | oracle.sql.NUMBER |
NUMBER | java.sql.Types.DOUBLE | double | oracle.sql.NUMBER |
RAW | java.sql.Types.BINARY | byte[] | oracle.sql.RAW |
RAW | java.sql.Types.VARBINARY | byte[] | oracle.sql.RAW |
LONGRAW | java.sql.Types.LONGVARBINARY | byte[] | oracle.sql.RAW |
DATE | java.sql.Types.DATE | java.sql.Date | oracle.sql.DATE |
DATE | java.sql.Types.TIME | java.sql.Time | oracle.sql.DATE |
TIMESTAMP | java.sql.Types.TIMESTAMP | java.sql.Timestamp | oracle.sql.TIMESTAMP |
因为NUMBER类型由于字段长度对应的Java类型有所不同,于是我把BigDecimal、Boolean、Byte、Short都给试了一遍,但还是报那个错。后面我才意识到是因为我值传的是null,JPA中不能参null值给number类型。
于是我采取了一个取巧的方法,如果是要传null值,就在dao层把参数赋为-1,然后修改SQL为如下语句。
AND (ro.is_included_commission = ?35 OR ?35 = '-1')