Sterownik Mongo Java ustalił, że wartość serial może "zmieścić się" w INT32, więc traktuje go jako taki. Po wywołaniu doc.getLong() prosisz sterownik o rzutowanie liczby całkowitej na wartość Long, stąd wyjątek rzutowania klasy. Jeśli na przykład wartość serial był 2147483648 (tj. maksymalna wartość całkowita + 1) wtedy sterownik Mongo Java uzna, że jest to INT64 i możesz bezpiecznie wywołać doc.getLong() .
Tak więc, ponieważ (a) wymodelowałeś ten atrybut jako Long w twoim modelu klasy i (b) nie każda utrwalona wartość tego atrybutu wymaga przechowywania jako INT64 ... musisz być wrażliwy na jego utrwalony typ podczas konwertowania go na długi.
Jak? Cóż, o ile serial atrybut jest utrwalany jako pewna liczba (np. INT32 , INT64 ) to połączenie ...
doc.get(DBConstants.SERIAL)
... zawsze zwróci obiekt będący jakąś podklasą java.lang.Number a zatem rzutowanie na Number i używając longValue() zadziała.
Na przykład:
serial = ((Number) doc.get(DBConstants.SERIAL)).longValue()