Поиск без учета регистра в EJB QL

Это выглядит очень просто, и я не могу поверить, что сам не нашел решения. У меня есть компонент с именем PersonBean, у которого есть имя. Теперь я хочу написать метод поиска, который принимает строку и ищет людей с этой строкой в ​​имени без учета регистра. Вот мой текущий EJB QL:

SELECT OBJECT(p)
FROM Person p
WHERE (p.name LIKE ?1)

У меня есть 2 проблемы с этим:

  1. Я хочу, чтобы в поиске не учитывался регистр (выше указано регистр), и я не могу найти что-то вроде lower() или же upper() в EJB QL. Что я могу сделать, чтобы иметь такое поведение? ОБНОВЛЕНИЕ: я использую J2EE версии 1.4 и Glassfish версии 2.1, если это имеет значение.
  2. Я должен передать некрасивую строку в метод, т.е. 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.

Другие вопросы по тегам