如何将算术表达式从SQL转换为JPQL?

时间:2017-02-10 21:55:45

标签: mysql sql jpql

我有一个数据库,我在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,但没有任何效果。

1 个答案:

答案 0 :(得分:0)

JPQL 不支持

POWCOS。除了基本的算术运算之外,JPQL仅支持一组有限的算术运算:ABSSQRTMODSIZEINDEX(参见{{ 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();

请注意,本机查询仍然能够返回托管实体。