Tôi đang sử dụng Hibernate/JPA để thực thi truy vấn PostGIS gốc. Vấn đề với các truy vấn này là chúng cần các tham số không thuộc dạng X = 'value' cổ điển.JPA/Hibernate Native Queries không nhận ra tham số
Ví dụ, những dòng sau sụp đổ
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)
Các truy vấn sau đây làm việc tuy nhiên:
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);
(nhưng nó là SQL injection dễ xảy ra ...)
Có ai biết cách sử dụng setParameter()
trong trường hợp này?
Waoo ... Cảm ơn bạn! điều này dường như làm việc !!! – user99054
+1 Bí quyết thú vị thực sự xác nhận vấn đề xuất phát từ dấu ngoặc kép, không phải từ các tham số được đặt tên (mà bạn nên tránh với JPA). –
Hoạt động trong Dữ liệu mùa xuân với chú thích NamedNativeQuery, do đó không yêu cầu tạo ra việc triển khai Kho lưu trữ. – lreeder