为了账号安全,请及时绑定邮箱和手机立即绑定

JPA /休眠本机查询无法识别参数

JPA /休眠本机查询无法识别参数

不负相思意 2019-11-18 13:01:41
我正在使用Hibernate / JPA执行本地PostGIS查询。这些查询的问题在于它们需要的参数不是经典的X =“值”形式。例如,以下几行崩溃 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)但是,以下查询有效: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);(但它很容易出现SQL注入...)有谁知道如何setParameter()在这种情况下使用?
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

未为本机查询定义使用命名参数。根据JPA规范(第3.6.3节“ 命名参数”):


命名参数遵循第4.4.1节中定义的标识符规则。命名参数的使用适用于Java Persistence查询语言,而不是为本机查询定义的。 仅位置参数绑定可用于本机查询。


因此,请尝试以下操作:


String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(?1 ?2)'),4326), 0.1)";

Query query = Cell.em().createNativeQuery(queryString, Cell.class);

query.setParameter(1, longitude);

query.setParameter(2, latitude);

请注意,在JPA> = 2.0中,可以在本机查询中使用命名参数。


查看完整回答
反对 回复 2019-11-18
?
LEATH

TA贡献1936条经验 获得超6个赞

也许你可以更换


'POINT(:lon :lat)'


'POINT(' || :lon || ' ' || :lat || ')'

这样,参数位于常量字符串之外,并且应由查询解析器识别。


查看完整回答
反对 回复 2019-11-18
?
达令说

TA贡献1821条经验 获得超6个赞

我遇到了类似的问题,发现可以在本机查询中使用问号设置参数。尝试这个:


String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(? ?)'),4326), 0.1)";


Query query = Cell.em().createNativeQuery(queryString, Cell.class);

query.setParameter(1, longitude);

query.setParameter(2, latitude);


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 361 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信