JPA 标准 API。使用带参数的 sql 函数调用进行查询
Posted
技术标签:
【中文标题】JPA 标准 API。使用带参数的 sql 函数调用进行查询【英文标题】:JPA Criteria API. Query with sql function call which takes parameters 【发布时间】:2011-08-14 19:02:04 【问题描述】:我正在尝试使用 Criteria typesafe API 构建此查询:
select * from xxx_table xxx where CALC_DISTANCE(xxx.latitude, xxx.longitude, :lat, :lng) < :dist
CALC_DISTANCE definded PL/SQL function:
FUNCTION calc_distance(
pLat1 NUMBER,
pLon1 NUMBER,
pLat2 NUMBER,
pLon2 NUMBER)
RETURN NUMBER
CriteriaBuilder builder = JpaHandle.get().getCriteriaBuilder();
CriteriaQuery<XXX> criteria = builder.createQuery(XXX.class);
Root<XXX> xxxRoot = criteria.from(XXX.class);
ParameterExpression<Double> latParam = builder.parameter( Double.class );
ParameterExpression<Double> lngParam = builder.parameter( Double.class );
ParameterExpression<Double> distParam = builder.parameter( Double.class );
Expression<Double> distFunction = builder.function("CALC_DISTANCE", Double.class, xxxRoot.get(XXX_.latitude), xxxRoot.get(XXX_.longitude), latParam, lngParam);
criteria.where(builder.greaterThan(distFunction, distParam));
TypedQuery<XXX> q = em.createQuery(criteria);
q.setParameter(latParam, latitude);
q.setParameter(lngParam, longitude);
q.setParameter(distParam, new Double(distance.toString()));
return q.getResultList();
我得到了这个例外:
Caused by: org.hibernate.QueryException: could not resolve property:
latitudegeneratedAlias0 of: domain.XXX
[select generatedAlias0 from domain.XXX as generatedAlias0 where
CALC_DISTANCE(generatedAlias0.latitudegeneratedAlias0.longitude:param0:param1)>:param2]
似乎 JPA 查询构造逻辑忘记用逗号分隔参数,还是我必须自己做?
【问题讨论】:
【参考方案1】:看起来您定义的 PL/SQL 函数需要 4 个参数,而您只显示了 2 个参数。
【讨论】:
以上是关于JPA 标准 API。使用带参数的 sql 函数调用进行查询的主要内容,如果未能解决你的问题,请参考以下文章
Atitit oodbms的查询,面向对象的sql查询jpa jpql hql