2011-04-28 111 views
6

我試圖用標準來構建這個查詢類型安全的API:JPA Criteria API。使用SQL函數調用查詢這需要參數

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查詢構造邏輯忘記與逗號分開的參數,還是我有某種方式自己做?

+0

看起來像Hib bug ... O_O – 2011-04-28 14:57:09

回答

0

它看起來像你定義的PL/SQL函數有4個參數,你只有2個參數顯示。