Какова общая практика реализации расширенного поиска (фильтрации) в EJB BMP?

Я разрабатываю проект с использованием Struts 1.3.8 + EJB 2.1.

У меня есть несколько навигационных JSP (есть какие-то таблицы, содержащие сущности). В меню навигации пользователь может выбрать условие фильтрации для каждого столбца таблицы. Он выбирает оператор фильтра в выпадающем списке и вводит значение условия.

Столбцы имеют разные типы, включая строку, данные, целое число и т. д.

Теперь я использую простой класс Condition, который инкапсулирует три значения (имя столбца, оператор и значение).

В действующем сервлете я отправляю условия в соответствующий EntityBean, вызывая метод Finder.

Метод Finder использует класс QueryBuilder, который генерирует SQL-запрос (практически он просто добавляет условия WHERE и проверяет данные).

Мне не нравится эта схема по нескольким причинам.

Во-первых, он использует необработанный SQL в QueryBuilder, поэтому я должен реализовать проверку данных, чтобы предотвратить инъекции SQL.

Во-вторых, представление и бизнес-уровни стали сильно связанными (представление должно знать имена столбцов, используемые в БД, или QueryBuilder должен знать имена столбцов, используемые в представлении).

Я могу использовать только версию EJB 2.1, а компоненты управления данными должны быть в формате BMP.

Я хочу знать, есть ли хорошая практика для реализации вышеуказанного механизма, или просто увидеть некоторые полезные предложения по моей проблеме.

Спасибо за помощь.


person user974994    schedule 16.11.2011    source источник


Ответы (1)


Чтобы решить ваши проблемы в первую очередь:

1) PreparedStatement следует использовать в фон, так что вам не нужно беспокоиться об этом.

2) Посмотрите на Fast Lane Reader, а затем вместо этого напишите API для фильтрации использования имен столбцов. В этом случае вам придется написать SQL самостоятельно и использовать указанный выше PreparedStatement.

Но один вопрос будет заключаться в том, сколько пользователей, сколько стоит каждый звонок и сколько у вас памяти. Недавно я написал приложение, которое извлекает десятки тысяч записей для пользователя, и обновление может занять больше минуты. К счастью, моя пользовательская база очень мала, поэтому я выбрал фильтрацию внешнего интерфейса. Это начальная загрузка, и от этого пользовательский опыт намного лучше. Мне также не нужно было показывать всегда актуальную информацию.

См. методы поиска Entity Bean VS DAO? для вопроса о производительности.

person Stefan    schedule 16.11.2011