Javaで扱うSQLのupdateやinsert文でめちゃくちゃに沼った、、、、
EntityやDtoのデータ型が一致しているはずなのに「ORA-00932: データ型が一致しません」のエラーが発生
SQLを条件分岐させることで回避に成功したので備忘録として
あれやこれやと調べまわり該当しそうな原因を確認したけど解消されない、、
このエラーで一日近く無駄にしてしまった。。。
結論 BigDecimal型のnullデータのセット時に発生する
今回の私のケースではBigDecimal型でしたが、もしかすると他の型でも発生するかもしれません。
エラーが発生したJava SQLコードの概要
StringBuilder sb = new StringBuilder();
sb.append(“ INSERT INTO TABLEXX (A , B , C) “);
sb.append(“ VALUES(:String, :String ,:BigDecimal) “);
SQLQuery exQuery = session.createSQLQuery(sb.toString);
exQuery.setParameter(“BigDecimal”,XXdto.getHoge());
のようになっていました。
一見というか普通に問題無いように思います、
各項目にデータが存在する場合はエラーになりません
しかしBigDecimal型のデータがnullの場合データ型が一致しませんのエラーが引き起こされてしまうのです
対策 SQLのnull判定で分岐させる
エラーを回避できるJava SQL
StringBuilder sb = new StringBuilder();
sb.append(“ INSERT INTO TABLEXX (A , B , C) “);
sb.append(“ VALUES(:String, :String “ );
if(XXdto.getHoge() == null){
sb.append(“ , null “ ); //nullを直接セットする
}else{
sb.append(“ ,:BigDecimal “ ); //データがある場合は従来の記述
}
SQLQuery exQuery = session.createSQLQuery(sb.toString);
if(XXdto.getHoge() != null){
exQuery.setParameter(“BigDecimal”,XXdto.getHoge());
データがある場合とnullの場合に分けてメインのSQLとパラメータの設定を条件分岐させます。
そうすることでBigDecimal型のnullが引き起こすエラーを回避出来ます
正直なぜダメなのか良くわかっていないので明確な理由が分かったら追記します。