1

私は Hibernate を使用していますが、単純な SQLQuery を実行しているため、これは基本的な JDBC の質問に要約されると思います。私の運用アプリは MySQL で実行されますが、私のテスト ケースはメモリ内 HSQLDB を使用します。SELECT COUNT 操作は、MySQL からは BigInteger を返しますが、HSQLDB からは Long を返します。

MySQL 5.5.22 HSQLDB 2.2.5

私が思いついたコードは次のとおりです。

SQLQuery tq = session.createSQLQuery(
    "SELECT COUNT(*) AS count FROM calendar_month WHERE date = :date");
tq.setDate("date", eachDate);
Object countobj = tq.list().get(0);
int count = (countobj instanceof BigInteger) ?
    ((BigInteger)countobj).intValue() : ((Long)countobj).intValue();

戻り型のこの問題は、 hibernate で createSQLQuery を使用して count(*) を取得するなど、他の SO の質問に対する回答を無効にしますか? setResultTransformer戻り値を Bean にマップするためにアドバイスが使用される場所。Bean のタイプは BigInteger または Long である必要があり、タイプが正しくない場合は失敗します。

データベースの相互運用性を恐れて、SQL の 'COUNT(*) AS count' 部分でキャスト演算子を使用することに消極的です。私はすでに使用してcreateSQLQueryいることに気付いているので、データベースの中立性を求める Hibernates の試みの範囲を超えていますが、以前はデータベースの制約に関して MySQL と HSQLDB の違いに問題がありました。

何かアドバイス?

4

3 に答える 3

1

Number にダウンキャストしてから、intValue() メソッドを呼び出すことができます。例えば

SQLQuery tq = session.createSQLQuery("SELECT COUNT(*) AS count FROM calendar_month WHERE date = :date");
tq.setDate("date", eachDate);
Object countobj = tq.list().get(0);
int count = ((Number) countobj).intValue();
于 2014-12-09T18:56:35.673 に答える
1

この問題の明確な解決策はわかりませんが、テストにはH2 データベースを使用することをお勧めします。

H2 データベースには、互換モードを使用して複数の異なるデータベースに接続できる機能があります。

たとえば、MySQL モードを使用するには、このjdbc:h2:~/test;MODE=MySQLURL を使用してデータベースに接続します。

于 2012-04-20T06:26:15.850 に答える
0

2 つのアイデア:

  1. 結果値を文字列として取得し、それを Long または BigInteger に解析できます

  2. を使用しないでください。次のCOUNT(*) AS count FROM ...ようなものを使用することCOUNT(*) AS cnt ...をお勧めしますが、サンプルコードでは結果列の名前を使用せずにインデックスを使用するため、単純に使用できますCOUNT(*) FROM ...

于 2012-04-20T06:27:31.990 に答える