2011-11-02 8 views
12

Napisałem projekt dla Hibernuj + MySQL. Teraz przenoszę ją do Derby (z kilku powodów).Czy HQL ma odpowiednik dla Restrictions.ilike (dla dopasowywania bez rozróżniania wielkości liter)?

Teraz odkryłem, że Derby rozróżnia wielkość liter podczas używania LIKE w zapytaniach. Można to rozwiązać za pomocą Restrictions.ilike(...) w zapytaniach Kryteria ... ale mam wiele pytań złożonych HQL, które używają tego. Czy istnieje sposób, aby mieć funkcjonalność podobną do ilike w HQL?

+0

Mówisz ** jak ** nie działa HQL w bazie danych Derby? – ManuPK

+1

jak * działa *, ale rozróżniana jest wielkość liter – gotch4

Odpowiedz

15

Nie ma ilike równoważne funkcje w HQL. Jak Konstantin już wskazał w swoim suggestion, najlepszym wyborem jest tune the database connection i ustawić collation na TERRITORY_BASED:SECONDARY, jak wyjaśniono w tym JIRA: DERBY-1748: Global case insensitive setting.

Należy wziąć pod uwagę, że w przypadku wszystkich równości (=) i like s nie będzie uwzględniana wielkość liter. To może pójść nieco zbyt daleko i nie nadawać się do konkretnej sytuacji.

Innym sposobem rozwiązania tego problemu byłoby utworzenie indeksów opartych na funkcjach (jeśli Derby je obsługuje, oczywiście) i dostrojenie swojego HQL w celu połączenia w ten sposób like i lower.

Query q = session.createQuery("... WHERE lower(entity.field) like ?)"); 
q.setString(0, '%' + variable.toLowerCase() + '%'); 

Jeśli Derby nie obsługuje FBI (myślę, że tak nie jest), można też tworzyć kolumny progowych wypełnione niższych wartościach i indeks im.

UPDATE To wydaje się być możliwe określenie pochodzące/generowanych automatycznie kolumn, jak wyjaśniono w tej drugiej JIRA: JIRA-481: implement SQL generated columns.

+0

, ale gotch4 woli zachować zapytania HQL –

+0

Nie ma innej opcji, jeśli nie chce zmienić sortowania połączeń. I zrozumiałem, że nie chce zamienić ich w zapytania o kryteria. –

+1

Rozumiem go - może być piekłem refaktoryzacji i testowania –

Powiązane problemy