gpt4 book ai didi

java - JPA/Hibernate native 查询无法识别参数

转载 作者:行者123 更新时间:2023-12-02 09:43:30 26 4
gpt4 key购买 nike

我正在使用 Hibernate/JPA 执行 native PostGIS 查询。这些查询的问题在于它们需要的参数不是经典的 X = 'value' 形式。

例如,以下几行会崩溃

 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 注入(inject)...)

有人知道在这种情况下如何使用setParameter()吗?

最佳答案

未为 native 查询定义命名参数的使用。来自 JPA 规范(3.6.3 命名参数部分):

Named parameters follow the rules for identifiers defined in Section 4.4.1. The use of named parameters applies to the Java Persistence query language, and is not defined for native queries. Only positional parameter binding may be portably used for native queries.

因此请尝试以下操作:

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 中,您可以在 native 查询中使用命名参数。

关于java - JPA/Hibernate native 查询无法识别参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com