2012-03-29 14 views
6

Tengo la siguiente consulta:JPA: realizar caso de orden insensible por

select p from Plan as p where p.location = :location order by p.name 

El problema es que si hay tres planes de la siguiente manera: de Apple bate átomo de mantequilla

La siguiente es devueltos: de Apple mantequilla átomo de bate

I requerir el siguiente: de Apple átomo de bate mantequilla

Respuesta

12

Por ejemplo con Hibernate puede utilizar funciones inferior a p.name en orden por:

select p from Plan as p where p.location = :location order by LOWER(p.name) 

Asumo anterior no se garantiza que funcione con todos implementaciones de JPA, debido al orden por el argumento no es uno de los siguientes:

  1. un state_field_path_expression que se evalúa como un campo de estado que se puede pedir de una entidad o clase incrustada tipo de esquema abstracto designado en la cláusula SELECT por uno de los siguientes:
    • un general_identification_variable
    • un single_valued_object_path_expression
  2. Un state_field_path_expression que dé como resultado el mismo campo de estado de la misma entidad o integrable tipo de esquema abstracto como a state_field_path_expression en la cláusula SELECT
  3. A result_variable que hace referencia a un elemento que se puede ordenar en la cláusula SELECT para el que se ha especificado el mismo result_variable. Esto puede ser el resultado de una expression_expression, una expresión_escalar, o una state_field_path_expression en la cláusula SELECT. Por ejemplo, las cuatro consultas siguientes son legales.

Si no funciona con la aplicación APP que utilice, usted tiene que utilizar siguiente consulta:

select p, LOWER(p.name) AS name_order 
from Plan as p 
where p.location = :location order by name_order 

Inconveniente es que resultado de la consulta es la lista de las matrices de objetos, primer elemento en cada ser lista instancia de entidad del Plan y segundo elemento que se descartará.

+0

su segundo método me da el error 'token inesperado: INFERIOR'. Parece que no importa dónde uso INFERIOR o SUPERIOR, siempre me da un error. Esto hace que la clasificación insensible a un caso sea imposible para mí y es un gran problema en este momento. –

+0

¿resolvió el problema con la búsqueda insensible a mayúsculas y minúsculas? – Monicka

3

siguiente obtiene resultados ordenados por caso 'orderField' insensibles

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<MyEntity> cq = criteriaBuilder.createQuery(MyEntity.class); 
Root<MyEntity> root = cq.from(MyEntity.class); 
cq.select(root).where(...).orderBy(cb.desc(cb.upper(duplicate.get(MyEntity_.orderField)))); 
TypedQuery<MyEntity> query = entityManager.createQuery(cq); 
query.getResultList(); 

Es como decirle a la consulta para convertir todos los caracteres en mayúsculas antes de la clasificación

+0

Podría ayudarme por favor: si estoy usando un 'join' solo para el propósito de clasificación como este' criteria.orderBy (cb.asc (root.join ("joinColumn"). Get ("sortingParam"))) ', ¿cómo usarías el 'cb.upper' en esa expresión? 'criteria.orderBy (cb.asc (cb.upper (root.join (" joinColumn "). get (" sortingParam "))))' parece ser un uso incorrecto. – BBerry

+0

¿de dónde viene 'duplicate.get (MyEntity_.orderField)'? – Benjamin

0

Caso pedido insensible que puede lograrse usando OrderBy anotación envolviendo pedido columna con LOWER o UPPER

@OrderBy("UPPER(firstName) ASC") 
private List<User> members = new ArrayList<User>(); 

Debajo de SQL generado por hibernación

SELECT user0_.id AS id1_0_0_, 
     user0_.firstname AS firstname2_0_1_, 
     user0_.lastname AS lastname3_0_1_ 
FROM user user0_ 
WHERE user0_.user_id=? 
ORDER BY upper(user0_.firstname) 
Cuestiones relacionadas