Драйверът на Mongo Java е определил, че стойността на serial може да се "побере" в INT32, така че го третира като такъв. Когато извикате doc.getLong() вие молите драйвера да преобразува своето цяло число към Long, оттук и изключението за преобразуване на класа. Ако, например, стойността на serial беше 2147483648 (т.е. максималната стойност на цяло число + 1), тогава драйверът на Mongo Java ще приеме, че това е INT64 и вие можете безопасно да извикате doc.getLong() .
Така че, тъй като (a) сте моделирали този атрибут като Long във вашия модел на клас и (б) не всяка персистирана стойност на този атрибут изисква съхранение като INT64 ... трябва да сте чувствителни към неговия постоянен тип, когато го конвертирате в Long.
как? Е, стига serial атрибут се запазва като някакъв вид число (напр. INT32 , INT64 ), тогава това обаждане ...
doc.get(DBConstants.SERIAL)
... винаги ще връща обект, който е някакъв подклас на java.lang.Number и следователно кастинг към Number и използвайки longValue() ще работи.
Например:
serial = ((Number) doc.get(DBConstants.SERIAL)).longValue()