2017-12-11 4 views
3

Ich benutze eine native Abfrage, um eine Liste von bigint Nummern, die ich dann zu iterieren planen.Implizit Casting Bigint Postgres DatatyTe zu Java Long

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

Wenn ich den langen Datentyp verwenden, wie oben gezeigt, wirft es die folgenden Fehler

java.math.BigInteger nicht java.lang.Long gegossen werden kann

Es scheint, Wie JPA konvertiert bigint standardmäßig aus der Datenbank in BigInteger.

BigInteger ist eindeutig ein riesiger Datentyp im Vergleich zu Long. Obwohl mein Feld während des Speicherns vom Typ Long in der definierten Entität ist, gibt es keine Möglichkeit, Daten zu verlieren, während BigInteger wieder in den Long-Wert konvertiert wird. Gibt es eine andere Möglichkeit, den BigInteger-Datentyp loszuwerden ? Genauer gesagt möchte ich nicht, dass die Methode getAllBigIntFieldValues Methode explizit BigInteger zu LongValue aufrufen.

+3

Für Begründung in * warum * das passiert, [diese Frage] (https://stackoverflow.com/q/27429422/1079354) bietet einige Einblicke. – Makoto

Antwort

1

Dies ist mit der Spring Data JPA-Mechanik nicht möglich.

Der relevante Teil des Quellcodes JpaQueryExecution

ist es ein ConversionService hat und versucht, es zu verwenden, um das Abfrageergebnis auf die gewünschte Art zu konvertieren:

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

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

Leider gibt es keinen Mechanismus zu Fügen Sie Konverter zu diesem Konvertierungsdienst hinzu.

Was Sie jedoch tun könnten, ist die Kraft von SQL zu verwenden und den Wert in der Auswahl in etwas zu konvertieren, das vom zugrunde liegenden JDBC-Treiber als Long angeboten wird.

Zum Beispiel sollte es möglich sein, in MySQL das Ergebnis ein UNSIGNED BIGINT and get a Long

einfach zu konvertieren bemerkte man Postgres im Titel erwähnt. BIGSERIAL might be an option there.