tablas tabla por ordenar numericamente filtro filtrar datos con columnas java hibernate hql hibernate-criteria

por - tabla model java



Criterios de hibernación: ¿cómo ordenar por dos columnas concatenadas? (2)

Tengo una tabla de persona que tiene dos columnas: nombre y apellido. La clase de persona tiene dos campos correspondientes: nombre y apellido. Ahora estoy usando la API de criterios y tratando de crear una orden basada en estas dos columnas concatenadas. ¿Es posible? O solo se puede lograr por hql?


Aquí un ejemplo para el sitio de hibernación de JBoss :

from DomesticCat cat order by cat.name asc, cat.weight desc, cat.birthdate

O desde el mismo sitio web, para la API de criterios :

List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list();

Parece que les gustan los gatos en JBoss.


Tuve el mismo problema y el mismo método de api orderBy de criterios no funcionará con columnas concatenadas. Necesitaba esto para usar con el método criteriaBuilder.construct (). Resolví esto extendiendo la clase Orale10gDialect y registrando la función personalizada:

import org.hibernate.dialect.Oracle10gDialect; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.type.StandardBasicTypes; public class CustomOracle10gDialect extends Oracle10gDialect { public CustomOracle10gDialect() { super(); // This must be used due to bug in Hibernate (orderBy won''t work with concat) registerFunction("concatwithspace", new SQLFunctionTemplate(StandardBasicTypes.STRING, "?1 || '' '' || ?2")); } }

Y entonces:

Expression<String> user = cb.function("concatwithspace", String.class, criteriaRoot.get("firstname"), criteriaRoot.get("lastname"));

...

criteriaQuery.orderBy(cb.asc(user));

Por supuesto, también debe seleccionar estas columnas concatenadas.