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?
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 ... –
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
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