gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:04:38 25 4
gpt4 key购买 nike

我有一个数据库,我在其中成功地使用 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

我需要将此处写为“38.0”、“-2.8”和“100”的值更改为输入参数并在 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,但没有任何效果。

最佳答案

JPQL 不支持

POWCOS。除了基本的算术运算,JPQL 只支持有限的一组算术运算:ABSSQRTMODSIZEINDEX(参见 JPA 2.1 Specification,第 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();

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

关于mysql - 如何将算术表达式从 SQL 转换为 JPQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169318/

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