2016-06-11 22 views
0

Ich habe eine Abfrage, die von Java-Anwendung wie folgt ausgeführt:PostgreSQL-Funktion um und JPA/Hibernate

Query query = getEntityManager().createQuery(hql); 

Die Abfrage sieht wie folgt aus:

String hql = "select * from table a where round(column1, 3) = round(parameter, 3)"; 

Hier column1 vom Typ Double. Der Wert, den es hält, ist wie 143.02856666. Ich muss den Wert so beibehalten, wie er ist, aber für eine Geschäftslogik muss er nur runden und vergleichen.

Die erste konfigurierte Datenbank war H2 und das hat gut funktioniert. Jetzt wurde die Datenbank in Postgres geändert und diese Abfrage ist nun fehlerhaft.

ERROR: function round(double precision, integer) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Die round() Funktion in Postgres nimmt einen numerischen Datentyp und braucht eine Besetzung.

Die folgende Abfrage funktioniert gut, wenn sie direkt in der Postgres-Konsole ausgeführt wird.

select * from table a where round(cast(column1 as numeric), 3) = round(cast(parameter as numeric), 3); 

Das gleiche von Java-Anwendung Fehler aus.

java.lang.IllegalArgumentException: org.hibernate.QueryException: Could not resolve requested type for CAST : numeric

auch versucht Query query = getEntityManager().createNativeQuery(hql); Dies führt zu einem neuen Fehler.

org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: syntax error at or near "where"

Wenn ich debugge, dies aus, wenn die folgende Zeile ausgeführt wird.

List resultList = query.getResultList(); 

Wie schreibe ich die Abfrage neu, so dass es gegen Postgres funktioniert?

+0

Ist 'Parameter' ein Aktualparameter und keine Spalte in Ihrer Tabelle? Wenn ja, wie würde Ihre Abfrage funktionieren, wenn die Abfragezeichenfolge nie manipuliert wurde? Außerdem habe ich gerade eine nativeQuery mit Eclipselink und Postgres getestet und es funktioniert. Und ich rate dir, die Frage immer auf das Wesentliche zu reduzieren und die Tabellendefinition für eine Frage wie diese zur Verfügung zu stellen ... –

+0

Danke, mein schlechter Wille mach's gut. Der Parameter wird an die Methode übergeben, in der diese Abfrage ausgeführt wird. Es ist wie: parmeter und wird mit .setParameter ("parameter", parameterValue) übergeben; – VKC

+1

Ich habe das behoben, indem ich auf big_decimal geworfen habe, was zu numerisch passt. Runde (Cast (Spalte1 als numerisch), 3) zu Runde (Cast (column1 als big_decimal), 3). Wenn show_sql aktiviert wird, wird diese Abfrage als rund angezeigt (cast (column1 wie numeric (19,2), 3) in der Konsole. Jeder Zeiger, wenn dies so geschrieben werden kann, dass er numerisch (19,2) in numerisch übersetzt (19,6), da dies genauere Ergebnisse liefert. – VKC

Antwort

0

Was Sie mit Query query = getEntityManager().createQuery(hql); tun, ruft eine jpql-Abfrage, die nicht alle db-Funktionen wie round(v numeric, s integer) unterstützt.

Zwei Vorschläge:

  1. Verwenden BETWEEN und pflegen JPQL-Mapping
  2. eine NativeQuery schreiben ->Query query = em.createNativeQuery(queryString);

Ihre queryString hat nur durch Ihre Parameter geändert werden.

+0

Vielen Dank für Ihren Vorschlag, ich habe versucht mit createNativeQuery, aber hat nicht funktioniert. Das Problem lag beim Zuordnungsdatentyp. Bitte beachten Sie meinen Kommentar oben. – VKC

Verwandte Themen