我有一个数据库,我在SQL中成功地进行了查询,但问题是我需要在JPQL中为一个REST服务的方法编写相同的查询。
这是有效的查询:
SELECT * FROM user u WHERE SQRT(POW(69.1 * (u.latitude - 38.0),2) + POW(69.1 * (-2.8 - u.longitude) * COS(u.latitude / 57.3), 2)) < 100
我需要将那里写的值更改为&#34; 38.0&#34;和&#34; -2.8&#34;和&#34; 100&#34;输入参数并在JPQL中创建。
这就是我试过的
@GET
@Path("nearusers={lat}&{lon}&{dist}")
@Produces({MediaType.APPLICATION_JSON})
public List<Usuario> findNearUsers(@PathParam("lat") BigDecimal lat,@PathParam("lon") BigDecimal lon, @PathParam("dist") BigDecimal dist){
TypedQuery query = getEntityManager().createQuery("SELECT u FROM User u WHERE SQRT(POW(69.1 * (u.latitude - :lat),2) + POW(69.1 * (:lon - u.longitude) * COS(u.latitude / 57.3), 2)) < :dist",Usuario.class);
List<User> users = query
.setParameter("lat", lat)
.setParameter("lon", lon)
.setParameter("dist", dist)
.getResultList();
return users;
}
当我启动此服务方法时,我的服务器收到的错误信息是:
Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [SELECT u FROM Usuario u WHERE SQRT(POW(69.1 * (u.latitud - :lat),2) + POW(69.1 * (:lon - u.longitud) * COS(u.latitud / 57.3), 2)) < :dist].
[35, 129] The encapsulated expression is not a valid expression
IDE(Netbeans)在构成查询的行中显示一些警告: IDE warnings
我尝试多次更改表达式,添加括号,将参数转换为double,但没有任何效果。
答案 0 :(得分:0)
POW
和COS
。除了基本的算术运算之外,JPQL仅支持一组有限的算术运算:ABS
,SQRT
,MOD
,SIZE
,INDEX
(参见{{ 3}},第4.6.17.2.2节。
因此,您需要使用在数据库的SQL方言中制定的 JPA本机查询:
Query query = getEntityManager().createNativeQuery(
"SELECT * FROM user u WHERE SQRT(POW(69.1 * (u.latitude - ?1),2) + POW(69.1 * (?2 - u.longitude) * COS(u.latitude / 57.3), 2)) < ?3",
User.class);
List<User> users = query
.setParameter(1, lat)
.setParameter(2, lon)
.setParameter(3, dist)
.getResultList();
请注意,本机查询仍然能够返回托管实体。