2010-01-11 13 views
3

Это тот же самый вопрос:Как динамически генерировать SQL-запрос на основе пользовательских настроек?

How to dynamically generate SQL query based on user's selections?

Единственное отличие состоит в том, что я заинтересован в том, чтобы решения также с помощью Java/JPA (+ возможно EclipseLink или Hibernate определенных расширений).

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

Запрос содержит несколько полей, но, чтобы получить идею я буду включать в себя только три из них ниже в качестве примера:

  • Занятие - может быть от 0 до п оккупационных строк. Если указаны строки занятости, один из них должен соответствовать.

  • Возраст - возраст может быть дано как:

    1. точное совпадение (30)
    2. диапазона (например, 30-40)
    3. меньше значения (-40)
    4. больше, чем значение (30-)

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

  • Высота - подобно тому, как возраст

Пример запросов:

Каких-либо критериев было дано:

select * from persons 

только занятие было дано:

select * from persons where occupation = 'dentist' 

Несколько занятий было дано:

select * from persons where (occupation = 'dentist' or occupation = 'engineer') 

Возраст было дано как большее, чем значение, и это необходимо, чтобы существовать на профиль человека:

select * from persons where age >= 30 

Высота была дана как и не требуется, чтобы существовали на лице человека:

select * from persons where (height is null or (height >= 30 and height <= 40)) 

Объединение Тион различных критериев:

select * from persons where occupation = 'dentist' and age >= 30 and (height is null or (height >= 30 and height <= 40)) 

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

ответ

0

В моем коде я использую AND и OR объектов для этого. Они берут списки как параметры (отлично смотрятся с вариативными аргументами Java 5) и объединяют их в Строках с необходимыми пробелами и скобками. Псевдокод:

AND(WhereCond ... conds) { this.conds = conds; } 
toString() { return conds.length == 0 ? "" : "(" + join(conds, " AND ") + ")" }; 

, где join() преобразует массив объектов в массив строк, а затем присоединяется к элементам с помощью параметра.

1

Если вы хотите сделать это в JPA 1.X, вы можете использовать собственный построитель запросов, как описано здесь http://rrusin.blogspot.com/2010/02/jpa-query-builder.html. Это позволяет создавать запросы, как это:

return new JpaQueryBuilder().buildQuery(em, 
       new Object[] { 
        "select c from Car c where c.name is not null", 
        new JQBParam("name", name, " and c.name = :name"), 
        new JQBParam("type", type, " and c.type = :type") 
       } 
      ) 
1

Я использую Querydsl рамки, потому что я использую JPA 1.0, который не включает в себя критерии API, и я также необходимы функции, которые вы описали. Написание кода Querydsl легко и код короче, чем код API Критерии. Querydsl имеет право использовать и поддерживает типы запросов.

3

Есть много различных инструментов, лучшие, что я думаю, являются querydsl, torpedoquery х Object Query, это три позволяют писать типизированный запрос, в противном случае вы можете использовать критерии API, и если вы используете JPA 2 также JPA2 Typesafe Query.

со всеми этими инструментами вы можете построить запрос во время выполнения !!

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