MybatisのOracleおよびMysqlのCountフィールドの問題

1554 ワード

MybatisのOracleおよびMysqlのCountフィールドの問題
私たちはプロジェクト開発を行う際にクエリーの総数の問題に遭遇することが多いので、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であることがわかります
解決策
  • はコードを変更する、受信MapMapに変更した後、タイプ変換
  • を行う.
  • 改Sql
  • MysqlではDecimalとNumericの両方がBigDecimalに変換されていることがわかりますので、Sqlファイルではタイプ変換すればいいです
    select CAST(count(1) as decimal(18,0)) as "totalCount" from table