@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, addScalar
method has second parameterを参照するときの混乱の 1 つです。Hibernateバージョン 3.6.X 以降、非推奨になっていることをHibernate.LONG
思い出してください。
LongType.INSTANCE
関連リンク