2011-04-28 9 views
6

Estoy tratando de construir esta consulta utilizando los criterios del API typesafe:JPA los criterios del API. Consulta con la llamada a la función de SQL que tiene parámetros

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(); 

consigo esta excepción:

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] 

parece que la lógica de la APP la creación de consultas se olvida de separar params con comas, o tengo que hacerlo de alguna manera?

+0

parece Hib insecto ... O_O –

Respuesta

0

Parece que su función PL/SQL definido tiene 4 argumentos y sólo tiene 2 argumentos mostrados.

Cuestiones relacionadas