2017-12-11 9 views
3

ネイティブクエリを使用して、bigintのリストを取得しています。私は上記のように、LONGデータ型を使用する場合はbigint postgres datatytpeをJava Longに暗黙的にキャストします。

@Query(value="SELECT bigint_field FROM complex_innerquery", nativeQuery=true) 
Collection<Long> getAllBigIntFieldValues(); 

は、それが

java.math.BigIntegerのがjava.lang.Longの

にキャストすることはできません

は、それはそう、次のエラーがスローされますJPAのようにbigintをデータベースからBigIntegerにデフォルトで変換します。

明らかに、BigIntegerはLongと比較して巨大なデータ型です。格納している間は、私のフィールドは定義されたエンティティのLong型であるため、BigIntegerからLong値への変換中にデータを失うことはありません。BigIntegerデータ型を取り除く方法はありますか?具体的には、getAllBigIntFieldValuesメソッドを呼び出すメソッドで、BigIntegerを明示的にLongValueに変換する必要はありません。

+3

なぜこのようなことが起こるのかについては、[この質問](https://stackoverflow.com/q/27429422/1079354)にいくつかの洞察があります。 – Makoto

答えて

1

これは、Spring Data JPAのメカニックでは実行できません。

ソースコードの関連部分は、それがConversionServiceを持っており、必要な型にクエリ結果を変換するためにそれを使用しようとしJpaQueryExecution

です:残念ながら

if (void.class.equals(requiredType) || requiredType.isAssignableFrom(result.getClass())) { 
    return result; 
} 

return CONVERSION_SERVICE.canConvert(result.getClass(), requiredType) // 
     ? CONVERSION_SERVICE.convert(result, requiredType) // 
     : result; 

、とメカニズムはありませんコンバータをこの変換サービスに追加します。

SQLの機能を利用して、selectの値を基になるJDBCドライバによってLongとして提供されるものに変換することができます。

は、例えば、それはちょうどあなたがタイトルにはPostgresを述べ指摘UNSIGNED BIGINT and get a Long

に結果を変換するために、MySQLの中で可能なはずです。 BIGSERIAL might be an option there

関連する問題