2012-04-24 15 views
0

私はオブジェクトをショートに変換したい。私のコードは次のようである:オブジェクトをショートに変換する

List<Batch> lsMaxBatch = em.createNativeQuery(sqlMaxBatch).getResultList(); 
Iterator iter = lsMaxBatch.iterator(); 
while (iter.hasNext()) { 
    Short batchId = Short.valueOf(iter.next() + ""); 
    ls.add(batchId); 
} 

それは大丈夫でしょうか?

Short batchId = (Short) iter.next(); 

私はエラーを取得:私はこのような変換やっている場合ので

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.Short 

おかげでこのような

+0

Object( 'Object []')の配列をShortにキャストしようとしています。いいえ、それは大丈夫ではありません。 'Object []'にキャストする必要があります。 –

+0

これは理にかなっていませんが、オブジェクトが短くて同等の表現をしているのはなぜですか? –

+0

私は1列だけを照会するため。列の型が短い –

答えて

4

型指定されていないクエリはList<Object[]>を返します。例外メッセージには、[Ljava.lang.Object; cannot be cast...というヒントがあります。

はあなたのコードを修正するには、次の

List<Object[]> lsMaxBatch = em.createNativeQuery(sqlMaxBatch).getResultList(); 
Iterator<Object[]> iter = lsMaxBatch.iterator(); 
while (iter.hasNext()) { 
    Object[] row = iter.next(); 
    Short batchId = (Short) row[0]; 
    ls.add(batchId); 
} 

はい、取得List<Object[]>を吸います。これを改善するには、EntityManager query creation methodsのいずれかを使用してTypedQuery<T>を返します。

+1

'Number'にキャストしてから' shortValue() 'を取得する方が安全でしょうか?可能であれば –

+0

;私は考慮しなかった/それを試みた。私は可能な限り、 'TypedQuery'の解決策を真っ直ぐ進めます。 –

+0

@GuillaumePoletまあ、バグを隠すこともできます。オーバーフローラッピングを望んでいない可能性があります(短いと予想していたint型のバグを示している可能性が高いため、例外が必要です)。 – yshavit

関連する問題