# Einheitliches Casting für Decimal und Integer-Werte



## Gast (5. Feb 2009)

Hallo,

ich habe ein Problem mit dem Casting von BigDecimal- und BigInteger-Werten. Bei meiner Software kann ich nicht im voraus sagen, ob eine Postgres Datenbank angebunden wird oder Oracle. Bei einer bestimmten Abfrage liefert mir Oracle BigDecimal-Werte und Postgres BigInteger-Werte. Für die Abfragen verwende ich Hibernate.
Da ich nicht jedesmal den Code ändern will, wenn sich die Datenbank ändert wäre ich dankbar, wenn Ihr eine Lösung bieten könntet.

Schonmal Danke im voraus.

Grüße.


----------



## tfa (5. Feb 2009)

Wie sieht denn die Abfrage aus? Möglicherweise kann man Hibernate dazu überreden, gleich den korrekten Typ zu liefern (SQLQuery.addScalar).
Als Workaround müsstes du einen eigenen HibernateType schreiben, der die Umwandlung vornimmt.


----------



## Guest (5. Feb 2009)

Ich kann leider nicht sagen wie der Select an sich aussieht. Der Code ist von einem Arbeitskollegen, den ich nicht mehr fragen kann. Ist ein wenig undurchsichtig weil er die Selects Matrizenartig über Tables und RowData zusammenbaut. Eins der Zwischenergebnisse ist eben eine Arraylist die BigDecimal-Werte für Oracle und BigInteger für Postgres liefert.

Leider habe ich keine Ahnung, wie man diese Hibernate-Types implementiert.


----------



## Guest (5. Feb 2009)

Habe mir jetzt solch einen Workaround gebastelt:

```
int id_int = 0;

try {
	BigDecimal val_id = (BigDecimal) i_val_id.next();
	id_int = val_id.intValue();
} catch (ClassCastException e) {
        try {
		BigInteger val_id = (BigInteger) i_cfg_val_id.next();
		id_int = val_id.intValue();
	} catch (ClassCastException e1) {
             //Fehlerbehandlung wenn beides nicht passt
	}
}
```


----------



## SlaterB (5. Feb 2009)

na so gesehen gibts da schon was einfacheres:

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        Object o = Math.random() > 0.5 ? new BigDecimal("4") : new BigInteger("4");
        Number n = (Number)o;
        System.out.println(n.getClass() + " - " + n.intValue());
    }
}
```


----------



## HoaX (5. Feb 2009)

wenn du eh intValue() aufrufst, dann mach doch einfach einen cast auf Number?!

Edith sagt: verdammt, SlaterB war schneller ...


----------

