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.