Estoy usando Hibernate/JPA para ejecutar consultas nativas de PostGIS. El problema con estas consultas es que necesitan parámetros que no son de la forma clásica X = 'valor'.Las consultas nativas JPA/Hibernate no reconocen los parámetros
Por ejemplo, las siguientes líneas chocan
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)
La siguiente consulta funciona sin embargo:
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);
(pero es la inyección de SQL-propensa ...)
¿Hay alguien ¿Sabes cómo usar setParameter()
en este caso?
waoo ... Gracias! ¡esto parece funcionar! – user99054
+1 Truco interesante que realmente confirma que el problema proviene de las comillas, no de los parámetros nombrados (que uno debería evitar con JPA). –
Funciona en Spring Data con la anotación NamedNativeQuery, por lo que no requiere la creación de la implementación de Repository. – lreeder