Ich verwende Hibernate/JPA, um native PostGIS-Abfragen auszuführen. Das Problem bei diesen Abfragen besteht darin, dass sie Parameter benötigen, die nicht der klassischen X = "Wert" -Form entsprechen.JPA/Ruhezustands-Abfragen erkennen Parameter nicht
Zum Beispiel zum Absturz bringen die folgenden Zeilen
String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(:lon :lat)'),4326), 0.1)";
Query query = Cell.em().createNativeQuery(queryString, Cell.class);
query.setParameter("lon", longitude);
query.setParameter("lat", latitude);
play.exceptions.JavaExecutionException: org.hibernate.QueryParameterException: could not locate named parameter [lon]
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:259)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: could not locate named parameter [lon]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:358)
Die folgende Abfrage funktioniert jedoch:
String queryString = String.format("select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(%f %f)'),4326), 0.1)", longitude, latitude);
Query query = Cell.em().createNativeQuery(queryString, Cell.class);
(aber es ist SQL-Injektion anfällige ...)
niemand wissen, wie man in diesem Fall setParameter()
verwendet?
Waoo ... Vielen Dank! das scheint zu funktionieren !!! – user99054
+1 Interessanter Trick, der das Problem tatsächlich bestätigt, kommt von den Anführungszeichen, nicht von benannten Parametern (die man mit JPA jedoch vermeiden sollte). –
Funktioniert in Spring-Daten mit NamedNativeQuery-Annotation, erfordert also keine Erstellung der Repository-Implementierung. – lreeder