4

ネイティブ SQL を使用して行数を返したい。しかし、コンソールは私に言いますjava.math.BigInteger cannot be cast to java.lang.Long。どうしたの?これは私の方法です:

public Long getNumRows(Integer id){

        Session session = null;

        session = this.sessionFactory.getCurrentSession();
        Query query = session
                .createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
                        + id + ";");
        List firstResult = query.list();

        return (Long) firstResult.get(0);


    }
4

3 に答える 3

12

BigInteger#longValue()にキャストする代わりに、メソッドを使用しLongます。

return firstResult.get(0).longValue();

firstResult.get(0)を返すようObjectです。1 つのオプションは、次のように型キャストすることBigIntegerです。

return ((BigInteger)firstResult.get(0)).longValue();

しかし、これをしないでください。代わりに、コメントでナンバリが提供する方法を使用してください。私は Hibernate のユーザーではないので、Hibernate 固有のソリューションを提供することはできません。

于 2013-08-13T20:20:34.503 に答える
4

@Rohit Jain's answerのコメントで提案されているように、Hibernate Scalar クエリを使用しました。@nambari さん、コメント ありがとうございます。

私たちが抱えている問題に来て、

Query query = session
            .createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
                    + id + ";");  

これらは、テーブル内の各列のスカラー値を持つオブジェクト配列 (Object[]) のリストを返しcontrollnewsます。Hibernate は ResultSetMetadata を使用して、返されたスカラー値の実際の順序と型を推測します。

ResultSetMetadata を使用するオーバーヘッドを回避するため、または単純に返される内容をより明確にするために、addScalar()を使用できます。

Query query = session
            .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id="
                    + id + ";").addScalar("count", LongType.INSTANCE);  

これはオブジェクト配列を返しますが、ResultSetMetadata を使用せず、代わりに基になる結果セットからcount列を明示的に取得しますLong

ResultSetMetaData から返されたものを Hibernate 型にマップする方法はjava.sql.Types、方言によって制御されます。特定のタイプがマップされていない場合、または期待されるタイプにならない場合はregisterHibernateType、Dialect で を呼び出してカスタマイズすることができます。


Query#setParameterメソッドを使用して、クエリの間違いを避ける ことができます。

Query query = session
           .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id= :id")
           .addScalar("count", LongType.INSTANCE).setParameter("id",id);  

Scalar query docs 4.0, addScalarmethod has second parameterを参照するときの混乱の 1 つです。Hibernateバージョン 3.6.X 以降、非推奨になっていることをHibernate.LONG思い出してください。
LongType.INSTANCE

関連リンク

于 2013-11-13T09:34:52.400 に答える