2016-05-26 3 views
0

私はリストのpropertyIdsを持っています。そして私はコレクションによってpropertyIdを取得したい。クエリ上記Collection <Long>の値がHibernateを使用して取得されている場合 - ClassCastException:java.math.BigDecimalをjava.lang.Longにキャストすることができません

Collection<Long> propertyIds = externalTaxManager.getPropertyIdsByTaxId(id); //Return type must be Collection<Long> 

これは私のDAOImplで、

public Collection<Long> getPropertyIdsByTaxId(Long externalTaxId) { 
    SQLQuery query = currentSession().createSQLQuery("select b.OMH_PROPERTY_ID from OMH_EXTERNAL_TAX a , " + 
       "OMH_EXTERNAL_TAX_PROP_XREF b\n" + 
       "where a.OMH_EXTERNAL_TAX_ID=b.OMH_EXTERNAL_TAX_ID and a.OMH_EXTERNAL_TAX_ID = :externalTaxId ") 
       .addScalar("OMH_PROPERTY_ID" , LongType.INSTANCE); 
     query.setParameter("externalTaxId", externalTaxId); 
     Collection<BigDecimal> propertyIdsList = (Collection<BigDecimal>) query.list(); 
    Long val = null; 
    Collection<Long> expRes = new HashSet<Long>(); 
    for(BigDecimal values : propertyIdsList){ 
     val = values.longValue(); 
     expRes.add(val); 
    } 
    return expRes; 
} 

がexternalTaxIdと関連付けるに500+の値を返します。これは私のコードです。スロー

例外は次のとおりです。間違っている

java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long. 

何?

+1

カラム 'OMH_EXTERNAL_TAX_PROP_XREF.OMH_PROPERTY_ID'の定義は何ですか?これはどこかの 'BigDecimal'にマップされており、' Long'にキャストできません。 –

+0

OMH_PROPERTY_IDはNOT NULL NUMBER(38) – yogesh

+1

これは 'Long'には長すぎますので、HibernateはこれをBigDecimalとして返します。あなたのコレクションを 'Collection 'に変更してください。本当に38桁のIDが必要ですか? –

答えて

0

抜粋以下は、私のために働きました。

public Collection<Long> getPropertyIdsByTaxId(Long externalTaxId) { 
     SQLQuery query = currentSession().createSQLQuery("select b.OMH_PROPERTY_ID from OMH_EXTERNAL_TAX a , " + 
       "OMH_EXTERNAL_TAX_PROP_XREF b\n" + 
       "where a.OMH_EXTERNAL_TAX_ID=b.OMH_EXTERNAL_TAX_ID and a.OMH_EXTERNAL_TAX_ID = :externalTaxId ") 
       .addScalar("OMH_PROPERTY_ID", LongType.INSTANCE); 
     query.setParameter("externalTaxId", externalTaxId); 
     Collection<BigDecimal> propertyIdsList = (Collection<BigDecimal>) query.list(); 
     Long propertyIdsListValue = null; 
     Collection<Long> propertyIds = new HashSet<Long>(); 
     for (BigDecimal propertyId : propertyIdsList) { 
      propertyIdsListValue = propertyId.longValue(); 
      propertyIds.add(propertyIdsListValue); 
     } 
     return propertyIds; 
    } 
+0

回答ボックスを使用して以降の質問を投稿しないでください。あなたの元の投稿を[編集]してください。これを投稿にコピーして、この回答を削除してください。 –

+0

が削除されて編集されました – yogesh

2

あなたの期待される戻り値の型を見て:

Collection<Long> 

が、DBを返します:キャストしようとし、その後

Collection<BigDecimal> propertyIdsList = query.list(); 

Collection<BigDecimal> 

はそう、あなたがあなたのコードを変更する必要があります他の方法ではBigDecimalからLongへ;予想通り

^_ ^私の下手な英語を許して...

+0

実際には、コレクションに変換する必要があります。コレクションの値をプロジェクトの従属システムに渡す必要があります。このアプリケーションでは、コレクションの値のみを受け入れます。では値を変換する方法はありますか? – yogesh

+0

返された配列を繰り返し処理し、適切な型の配列にコピーする必要があります。しかし、返された値のいずれかが大きすぎて「Long」に収まらないときは、どうしますか? –

+0

@ジムガリソン私が投稿した回答をご覧ください。 – yogesh

関連する問題