2010-08-04 5 views
2

Это выглядит очень просто, и я не могу поверить, что сам не нашел решение. У меня есть bean с именем PersonBean, у которого есть имя. Теперь я хочу написать метод finder, который берет строку и ищет людей с этой строкой в ​​их имени, без учета регистра. Вот мой текущий EJB QL:нечувствительный к регистру поиск в 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")?
+0

Там нет ничего о JPA в этом вопросе (JPA был введен в Java EE 5 и EJB 3.0). Поэтому, пожалуйста, не помещайте его JPA. –

+0

Я этого не сделал, может быть, кто-то отредактировал, чтобы добавить его. – phunehehe

ответ

1

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

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

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

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

нет извините, что не работает (дает синтаксическую ошибку) – phunehehe

+0

спасибо, на самом деле это 'WHERE LOCATE (? 1, p.name) <> 0 ', и если он используется в файле xml, например' ejb-jar.xml', он должен быть 'WHERE LOCATE (? 1, p.name) < > 0' – phunehehe

2

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

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

+0

спасибо за информацию, но я использую glassfish v2.1 – phunehehe

 Смежные вопросы

  • Нет связанных вопросов^_^