2012-07-18 23 views
5

Básicamente, mi pregunta es la misma que éste, pero para Java (JBoss) Hibernate: How can we order a column as int using hibernate criteria API?cadena Convertir a int en el criterio para Hibernate

Quiero crear una restricción de orden con un elenco a int de una cuerda columna. Algo como

criteria.addOrder(Order.asc("cast(id as int)")); 

La excepción es "No se pudo resolver la propiedad: emitir (id como int) de [Clase]". He intentado tanto cast (as) como convert (,) con int y entero.

Respuesta

14

A pesar de que el tema es antiguo y es posible que el problema se haya resuelto, publicaré la solución. Tal vez será útil en el futuro para alguien.

criteria.addOrder(new org.hibernate.criterion.Order("anystring", true) { 
      @Override 
      public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { 
       return "cast(id as int)"; 
      } 
     }); 
+1

Esta solución funciona si no desea especificar ascendente o descendente, porque el segundo parámetro se usa en el método original deSqlString. Si lo reemplaza, tiene que agregar asc o desc al final de la cadena por su cuenta. – KarolR

+1

KarolR, es por eso que el método se llama aSqlString. Puede escribir su propio pedido como lo desee, pero debe especificar la cadena de orden completa. Y uno más: siempre hay una orden, por defecto se usa "asc", por lo que "cast (id as int)" es en realidad "cast (id as int) asc", pero puede omitirlo. Puede especificar el orden complejo, ¿cómo hibernar debería decidir dónde colocar la dirección, que se especificó como parámetro? – yorlin

+0

es de hecho muy útil y me salvó de pasar mucho tiempo para refactorizar mi código de criterios como sql solo por problema de orden. +1 por sus comentarios y respuesta. – nihirus

3

Si la columna contiene valores enteros, la mejor solución es asignarla como un entero en lugar de una cadena.

Si, por razones oscuras, esto no es posible, puede agregar un campo entero anotado con @Formula("cast(id) as number") en su entidad y el orden en este campo.

+0

Debido a llamadas genéricas y al tener algunas tablas con identificadores de cadena, se decidió convertir todo a String. De todos modos, no puedo usar la anotación Fórmula debido a excepciones de error en la compilación de maven (en el hibernate3-maven-plugin), así que no puedo probarlo y dejaré este tema en espera . Tks – spnbldk

+1

debe ser '@Formula (" cast (id como NUMBER (10,0)) ")' – jtomaszk