MybatisのOracleおよびMysqlのCountフィールドの問題
1554 ワード
MybatisのOracleおよびMysqlのCountフィールドの問題
私たちはプロジェクト開発を行う際にクエリーの総数の問題に遭遇することが多いので、
これは、Mybatisにタイププロセッサがあり、resultTypeが検出されるとIntタイプの値に変換されるため、OracleでもMysqlでも問題ありません.だから受信は大丈夫です.しかし以下のような書き方であればresultTypeをMapにすると問題になります.
MybatisでresultTypeがMapの場合、結果パラメータを受信するときに
解決策はコードを変更する、受信 を行う.改Sql MysqlではDecimalとNumericの両方がBigDecimalに変換されていることがわかりますので、Sqlファイルではタイプ変換すればいいです
私たちはプロジェクト開発を行う際にクエリーの総数の問題に遭遇することが多いので、
select count(1) from table
で直接クエリーを行います.Mybatisでは通常こう書いています
これは、Mybatisにタイププロセッサがあり、resultTypeが検出されるとIntタイプの値に変換されるため、OracleでもMysqlでも問題ありません.だから受信は大丈夫です.しかし以下のような書き方であればresultTypeをMapにすると問題になります.
MybatisでresultTypeがMapの場合、結果パラメータを受信するときに
Map
のMapがインスタンス化されます.問題はここにあります.以前のコードではMap
で受信されていましたが、Oracleでは問題ありません.Oracleでcount関数で得られた値はJavaに対応するタイプがBigDecimalですが、Mysqlでは問題が発生します.ResultSetMetaData.getClassNameForJavaType()
のメソッドではMysqlフィールドに対応するJavaフィールドが見られますが、Mysqlでクエリされたcountで得られたデータベースタイプがBigIntタイプの対応するJavaタイプがLongであることがわかります解決策
Map
をMap
に変更した後、タイプ変換select CAST(count(1) as decimal(18,0)) as "totalCount" from table