Parsen in BigInt (mysql)?

sicLotus

Bekanntes Mitglied
Hallo, ich habe eine Datenbank angelegt mit einem BigInt Wert. Genauer gesagt möchte ich die ISBN13 damit festhalten. Ich habe mir durch JPA2 meine Models/Data erstellen lassen und dieser hat mir die BigInt in Java EE durch BigInteger ersetzt.

Nun möchte ich Daten in die DB schreiben, doch wenn das BigInteger laenger als 10 Zeichen lang ist, dann kommt es zu folgendem Fehler:
Exception Description: General Problem parsing the query [select b from Book b where b.isbn13=1234567123123]
Internal Exception: java.lang.NumberFormatException: For input string: "1234567123123"

Weiß einer wieso so eine Fehlermeldung kommt? Wieso kann er das nicht parsen?
 
S

SlaterB

Gast
String muss man mit Anführungszeichen schreiben, so ist es eine Zahl, die der DB-Treiber wohl versucht auf long zu parsen, zu lang,

was ist denn der Datentyp in der DB, in SQL? alles andere außer Strings, Ganzzahlen im niedrigen Bereich und double besser nicht verwenden,
keine komischen Spielereien wie BigInt, welches nicht normal als String gespeichert wird
 

sicLotus

Bekanntes Mitglied
Wie ich schon geschrieben hab, habe ich BigInt(13) für die ISBN13 genommen. Was sollte ich sonst nutzen? String? Sind 13 Ziffern für long wirklich schon zu lang? Dachte der Wertebereich liegt doch ein wenig höher...
 
S

SlaterB

Gast
in der Tat, Long kann 19 Ziffern verkraften, leicht herauszufinden,
hat die Fehlermeldung einen StackTrace so dass man erkennen kann ob stattdesse Integer.parseInt() verwendet wurde?
beide werfen leider gleichlautende Fehlermeldungen

hab noch kurz 'jdbc bigint' gesucht und gefunden
The corresponding SQL type BIGINT is a nonstandard extension to SQL. In practice the SQL BIGINT type is not yet currently implemented by any of the major databases, and we recommend that its use be avoided in code that is intended to be portable.
http://download.oracle.com/javase/1.3/docs/guide/jdbc/getstart/mapping.html
aber das muss ja nicht so sein, vielleicht auch ein Buch von vor 20 Jahren,
ich kann hier nichts mehr beitragen
 
Zuletzt bearbeitet von einem Moderator:

sicLotus

Bekanntes Mitglied
Hey du hast recht!!!
Caused by: java.lang.NumberFormatException: For input string: "1234567890123"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:461)
at java.lang.Integer.valueOf(Integer.java:554)

Das ist natürlich so nicht gewollt.. kann ich das umgehen?
 
S

SlaterB

Gast
wollte fast noch dazuschreiben: wenn es Integer statt Long ist, habe ich persönlich deswegen leider noch lange keine Ahnung warum,
diese Erkenntnis bringt also nicht unbedingt viel

hab immerhin nochmal 'NumberFormatException ISBN13' gesucht, da kam
No quotations around isbn13 data - Report a problem - Times Developer Network Forum
raus, was eher davon spricht dass man keine Anführungszeichen setzen soll, das hättest du ja schon

hast du schon MIT Anführungszeichen versucht?
was kommt eigentlich im ResultSet zurück, wenn du entsprechende Spalten abfragst?
bzw. du hast ja JPA, was hast du in den Java-Klassen konfiguriert?,
kannst du in den Querys nicht BigInt-Objekte übergeben statt eine Zahl direkt in SQL zu schreiben?
oder machst du das bereits und der Fehler ist nur intern ein Zwischenschritt?

ach und wenn man nur genug schreibt fällt mir vielleicht noch was ein:
schreibe ein kleines l ans Ende der Zahl, so wie man long-Werte in Java definiert?
Java:
public class Test {
    public static void main(String[] args)  {
      int aa = 99999999;
      int bb = 9999999999; // Fehler
      long c = 9999999999l;
    }
}
 
Zuletzt bearbeitet von einem Moderator:

sicLotus

Bekanntes Mitglied
Okay, also ich habs jetzt erstmal mit long probiert anstatt mit biginteger... das ging auch nicht, er wollte das trotzdem in int konvertieren.. dann habe ich es mal mit Anführungszeichen probiert (+long, noch nicht mit biginteger) dann kam dieser Fehler:
WARNUNG: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
at store.data.Book._persistence_set(Book.java)

Mir scheint, mein JPA Persistence will das irgendwie immer zu nem integer machen.. warum?!

Meine Anfrage sieht eigentlich so aus:
Java:
Query bookExists = emf.createEntityManager().createQuery("select b from Book b where b.isbn13=" + isbn13 + " or b.isbn10=" +isbn10);

Wobei halt isbn entweder BigInt oder long bisher war..

Wie kann ich mir denn anzeigen lassen was mein resultset zurückliefert? Bisher greife ich z.B. so darauf zu:
Java:
Query bookExists = emf.createEntityManager().createQuery("select b from Book b where b.isbn13='" + String.valueOf(isbn13) + "' or b.isbn10=" +isbn10);
bookExists.getResultList().get(0);

Bei JPA habe ich gar nichts konfiguriert :/ Ich lese die ISBN aus einem Formularfeld aus und mache folgendes:
Java:
long isbn13 = Long.valueOf(request.getParameter("ISBN13"));
Ich denke nicht das ich noch ein l ranfügen müsste?!
 
S

SlaterB

Gast
was ist denn bookExists.getResultList().get(0)? ein Objekt der Klasse Book? wie ist dort isbn13 definiert, BigInteger?

> long isbn13 = Long.valueOf(request.getParameter("ISBN13"));
was ist request.getParameter("ISBN13"), ein String? na wenn das mit Web-Formular zu tun hat ist das wohl für die DB egal

-------
Java:
createQuery("select b from Book b where b.isbn13=" + isbn13 + " or b.isbn10=" +isbn10);
probiere doch bitte
Java:
1)
createQuery("select b from Book b where b.isbn13='" + isbn13 + "' or b.isbn10='" +isbn10+"'");

2)
createQuery("select b from Book b where b.isbn13=" + isbn13 + "l or b.isbn10=" +isbn10+"l");

3)
createQuery("select b from Book b where b.isbn13=? or b.isbn10=?");
query.setParam(1,new BigInteger(isbn13));
bzw. wie immer man den letzten Fall mit Parametern in deinen Framework richtig umsetzt

edit: wenn isbn13 und isbn10 unterschiedliche Datentypen sind, dann nur einzeln testen
 
Zuletzt bearbeitet von einem Moderator:

sicLotus

Bekanntes Mitglied
Die Klasse Book wurde von JPA angelegt, in dem ich "create classes from entity" gewählt hatte.
Dort wurde automatisch Book als BigInteger angelegt, das habe ich jetzt probehalber zu long geändert.

Jup, das request ist ein String, das hatte ich bei BigInteger mit dem Konstruktor umgewandelt, bei long durch valueOf().

Dein erstes und zweites Query lieferten folgendes (bei long):
Java:
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
	at store.data.Book._persistence_set(Book.java)

Bei BigInteger folgendes:
Du bist ein Gott :)
Deine zweite Variante hat geklappt.. das gibt es doch gar nicht :)
Vielen vielen herzlichen Dank! Wer hätte gedacht das Java/JPA/JDBC/MySQL solche Probleme machen würden... :)
Nochmals danke!
 

Ähnliche Java Themen


Oben