2012-03-29 20 views
6

Mam następujące zapytanie:JPA: wykonać wielkość liter ma znaczenie zamówienie

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

Problemem jest to, że jeśli istnieją trzy plany, co następuje: Jabłko bat atom Masło

Poniżej znajduje zwracane: Jabłko Masło atom bat

I wymagają następujące czynności: Jabłko atom bat Masło

Odpowiedz

12

Na przykład z Hibernate można stosować niższe funkcję p.name w kolejności:

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

Zakładam powyżej nie jest gwarantowana do pracy ze wszystkimi implementacje JPA, ponieważ argument ORDER bY nie jest jedną z następujących czynności:

  1. state_field_path_expression ocenia, że ​​na polu można zamówić państwowej jednostki lub zabudowany klasa typ abstrakcyjny schemat wyznaczony w klauzuli SELECT przez jedną z następujących czynności:
    • w general_identification_variable
    • w single_valued_object_path_expression
  2. state_field_path_expression który ocenia na tym samym polu państwowego tego samego podmiotu lub do osadzeniem abstrakcyjny typ schematu jako state_field_path_expression w klauzuli SELECT
  3. Zmienna wynikowa, która odnosi się do pozycji do zamówienia w klauzuli SELECT, dla której określono tę samą zmienną wynikową. Może to być wynikiem wyrażenia_suma_wego, wyrażenia_arabarowego lub wyrażenia_całkowitego_path_path w klauzuli SELECT. Na przykład cztery poniższe pytania są poprawne.

Jeśli to nie działa z wdrożenia WZP użyć, trzeba użyć następującego zapytania:

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

wadą jest to, że wynik zapytania jest lista tablic obiektów, pierwszy element w każdym liście samopoczucia wystąpienie obiektu Planu i drugi element do odrzucenia.

+0

Twoja druga metoda daje mi błąd "nieoczekiwany token: LOWER". Wygląda na to, że nie ma znaczenia, gdzie używam LOWER lub UPPER, zawsze daje mi to błąd. Sprawia to, że sortowanie z niewidocznymi przypadkami jest dla mnie niemożliwe i jest obecnie bardzo dużym problemem .. –

+0

Czy udało Ci się rozwiązać problem z wyszukiwaniem niewrażliwym na wielkość liter? – Monicka

3

Po dostaje wyniki posortowane według przypadku „orderField” niewrażliwego

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(); 

To jak mówienie zapytanie przekonwertować wszystkie znaki na wielkie uprzedniego sortowania

+0

Czy możesz mi pomóc: jeśli używam 'join' tylko w celu sortowania, takim jak to' criteria.orderBy (cb.asc (root.join ("joinColumn"). Get ("sortingParam"))) ', jak użyłbyś 'cb.upper' w tym wyrażeniu? 'criteria.orderBy (cb.asc (cb.upper (root.join (" joinColumn "). get (" sortingParam ")))) wydaje się być niewłaściwym użyciem. – BBerry

+0

Skąd pochodzi 'duplicate.get (MyEntity_.orderField)'? – Benjamin

0

wielkość liter ma znaczenie kolejność można osiągnąć stosując OrderBy adnotacji owijając zamawiania kolumna z LOWER lub UPPER

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

Poniżej kodu SQL wygenerowanego przez hibernację:

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) 
Powiązane problemy