поиск без учета регистра в EJB QL - PullRequest
2 голосов
/ 04 августа 2010

Это выглядит очень просто, и я не могу поверить, что сам не нашел решения.У меня есть компонент с именем 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 ]

2 голосов
/ 04 августа 2010

EJB-QL, используемый в бинах сущностей EJB 2.x (не путать с JPQL, как в бинах сущностей JPA и EJB3), крайне ограничен. Хотя в EJB 2.1 было несколько дополнений к языку, по моему мнению, нет верхних / нижних функций.

Я не знаю, в каком контейнере вы работаете, но JBoss сделал некоторые расширения для EJB-QL (называемые JBossQL) и имеет функцию UCASE .

1 голос
/ 04 августа 2010

Что касается вашего второго вопроса, в EJB QL 2.1 есть функция CONCAT, поэтому я думаю, что должно работать следующее:

WHERE (p.name LIKE CONCAT ('%', CONCAT(? 1, '%')))

Редактировать: Выше не работает, потому что грамматика ql допускает только литеральные строки и входные параметры в выражении LIKE,что действительно ограничивает.Можно добиться того же эффекта, используя функцию LOCATE, подобную этой:

WHERE LOCATE(p.name, ?1) <> 0
...