1

在我当前的项目中,我使用休眠 JPA 作为持久性库。将参数设置为查询时,我遇到了奇怪的错误。

我有以下内容:

List<Location> loca = JPA.em().createQuery(
    "SELECT location FROM Location as location"
    + " where "
    + "( 6371 * acos(cos(PI() / 180 * :platitude ) * cos(PI() / 180 *location.latitude  ) * "
    + "cos(PI() / 180 *location.longitude  - PI() / 180 *:plongitude ) + sin( PI() / 180 *:platitude) * "
    + "sin(PI() / 180 *location.latitude ) ) ) < :radius")
    .setParameter("radius", 10000.0)
    .setParameter("platitude", new Double(latitude))
    .setParameter("plongitude", new Double(longitude))
    .getResultList();

结果错误是:

[IllegalArgumentException:参数值 [43.239474] 与类型 [java.lang.Integer] 不匹配]

但是由于精度损失,这个值不能转换为整数。

有什么建议么?

4

2 回答 2

2

如果您在 JPA 下使用 Hibernate,则可以通过直接使用 Hibernate 会话来解决此问题。我遇到了同样的问题,找不到其他方法。

以下应该有效:

Session session = (Session) JPA.em().getDelegate();
List<Location> loca = session.createQuery(
    "SELECT location FROM Location as location"
    + " where "
    + "( 6371 * acos(cos(PI() / 180 * :platitude ) * cos(PI() / 180 *location.latitude  ) * "
    + "cos(PI() / 180 *location.longitude  - PI() / 180 *:plongitude ) + sin( PI() / 180 *:platitude) * "
    + "sin(PI() / 180 *location.latitude ) ) ) < :radius")
    .setParameter("radius", 10000.0, new DoubleType())
    .setParameter("platitude", new Double(latitude), new DoubleType())
    .setParameter("plongitude", new Double(longitude), new DoubleType())
    .list();
于 2013-07-10T19:53:39.783 回答
0

JPA 需要 :radius 的 Double 类型参数值。所以只需将半径参数分配更新为;

.setParameter("radius", new Double(10000.0))
于 2015-08-25T08:54:23.880 回答