Поиск без учета регистра в EJB QL
Это выглядит очень просто, и я не могу поверить, что сам не нашел решения. У меня есть компонент с именем PersonBean, у которого есть имя. Теперь я хочу написать метод поиска, который принимает строку и ищет людей с этой строкой в имени без учета регистра. Вот мой текущий EJB QL:
SELECT OBJECT(p)
FROM Person p
WHERE (p.name LIKE ?1)
У меня есть 2 проблемы с этим:
- Я хочу, чтобы в поиске не учитывался регистр (выше указано регистр), и я не могу найти что-то вроде
lower()
или жеupper()
в EJB QL. Что я могу сделать, чтобы иметь такое поведение? ОБНОВЛЕНИЕ: я использую J2EE версии 1.4 и Glassfish версии 2.1, если это имеет значение. - Я должен передать некрасивую строку в метод, т.е.
findByString("%john%")
, Есть ли способ написать EJB QL, чтобы я мог передать что-то вродеfindByString("john")
?
2 ответа
Что касается вашего второго вопроса, есть CONCAT
функция в EJB QL 2.1, поэтому я думаю, что должно работать следующее:
ГДЕ (p.name LIKE CONCAT('%', CONCAT(?1, '%')))
Изменить: выше не работает, потому что грамматика ql допускает только литеральные строки и входные параметры в LIKE
выражение, которое действительно ограничивает. Должно быть возможно достичь того же эффекта, используя LOCATE
функционировать так:
WHERE LOCATE(p.name, ?1) <> 0
EJB-QL, используемый в бинах сущностей EJB 2.x (не путать с JPQL, как в бинах сущностей JPA и EJB3), крайне ограничен. Несмотря на то, что в EJB 2.1 были некоторые дополнения к языку, по моему мнению, нет верхних / нижних функций.
Я не знаю, в каком контейнере вы работаете, но JBoss сделал некоторые расширения для EJB-QL (называемые JBossQL) и имеет функцию UCASE.