Tengo una tabla Persona que tiene dos columnas: nombre y apellidos. La clase de Persona tiene dos campos: nombre y apellidos. Ahora estoy usando la api de criterios y tratando de crear un orden basado en estas dos columnas se concatenan. Es posible? O sólo se puede lograr por hql?

La clasificación por la concatenación de las columnas sólo tendrá sentido si concatenar su parte inferior (o superior) en el caso de las representaciones. De lo contrario, la clasificación es equvilaent para ordenar por 2 columnas, es decir, el fin por first_name, last_name.
no se obtiene el mismo resultado para ambos métodos? Tienes que tener cuidado si se ordena con nombre/apellido.
en la mayoría de los casos, pero digamos que usted tiene estos nombres para ordenar: (John Anderson, Johna Carnicero). JohnAndreson < JohnaButcher, pero johnanderson > johnabutcher, porque a < a.
si usted concatenar con un espacio entre el nombre y el apellido de usted no recibe este problema. También evitar este problema si hacer primero un ordenar los apellidos y, a continuación, ordenar estos datos ordenados de acuerdo con el primer nombre.

OriginalEl autor Georgie Porgie | 2011-07-19

2 Comentarios

  1. 25

    Aquí un ejemplo para el JBoss hibernate sitio:

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

    O desde el mismo sitio web, para el Criterios de api:

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

    Parecen ser muy aficionado a los gatos en JBoss.

    En este caso, el orden de las columnas no están concatenados. Quiero lograr algo como «ordenar por nombre || »|| apellidos»
    Como escribí en los comentarios a su pregunta, no veo la diferencia.
    Oh, sí, a la derecha. Lo siento, no he leído sus comentarios sobre la primera. Pero, ¿qué acerca de los escenarios cuando tengo que pedir por campo1 + campo2? Ambos campo1 y campo2 son numéricos.
    Usted podría tratar de order by (item.field1 + item.field2). No sé si funcionará, así que por favor hágamelo saber. Me encontré con un SQL ejemplo donde se utiliza la división, así que mi conjetura es que hql puede también ocuparse de las operaciones para la realización del pedido. Si las operaciones matemáticas que hacen el trabajo, order by concat(item.lastName + " " + item.firstName) probablemente también funciona.
    hql está bien con este tipo de operación, pero los criterios api parece fallar.

    OriginalEl autor toto2

  2. 0

    Tuve el mismo problema y los criterios de la api de orderBy método no funciona con concatenados columnas. Necesitaba esto para usar con criteriaBuilder.construct() método. Lo resuelto por la ampliación de Orale10gDialect clase y registrar 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 luego:

    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 esta concatenado columnas.

    OriginalEl autor KamilJ

Dejar respuesta

Please enter your comment!
Please enter your name here