Как использовать Criteria API для поиска конкретного человека по разным критериям?

Мне нравится вся помощь, которую я получил в прошлом, просто читая ваши темы, однако теперь я наткнулся на то, что буквально понятия не имею, как реализовать вообще.

Правка: большую часть забыл -> Мой фреймворк: я запускаю это на Netbeans, используя сервер Glassfish с EJB, а БД запускается на сервере MySQL. Также я использую JPA.

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

Моя база данных: Моя база данных

Я попытаюсь упростить то, что я пытаюсь сделать, это может помочь мне получить некоторое представление об этом, пока я печатаю.

Я пытаюсь

  • Найдите все pid в доступности, где даты, которые пользователь отправляет, находятся между ними. Пример: пользователь отправляет в периоде 2010-10-10 на 2011-01-01, я пытаюсь найти все pid, где в доступности, from_date "выше" или прошло 2010-10-10, а to_date ниже до или после 01.01.2011.

  • Найдите все pid в Competence_profile, где компетентность_имя — это имя, отправленное пользователем, а years_of_experience как минимум равно или превышает количество лет опыта, которое отправляет пользователь.

  • Соедините их каким-то образом, чтобы я получил Person p из таблицы Person, который соответствует pid, оставшемуся от объединения (это означает, что pid существовал как в Availability, так и в Competence_profile для критериев).

Как мне сделать что-то подобное на основе Criteria API? Я немного поигрался с ним и прочитал довольно много руководств и тем, но ни один из них не смог ответить на мой вопрос о том, как я могу объединить его в этой форме.

Любая помощь очень ценится!


person Devil    schedule 27.02.2013    source источник


Ответы (1)


Это с Hibernate Criteria API.

     // First set up a subquery to get the ids of Persons who are available
     // (assuming that the Person must be available for the entire duration)
     DetachedCriteria dc = DetachedCriteria.forClass(Person.class)
         .setProjections(Projections.id())
         .createAlias("availability", "a")
         .add(Restrictions.le("a.to", endDate)
         .add(Restrictions.ge("a.from", startDate);

     Criteria crit = session.createCriteria(Person.class)
          .createAlias("competence", "c")
          .add(Restrictions.eq("c.name", competenceName)
          .add(Subqueries.in(dc,"id");

     List<Person> people = crit.list();
person carbontax    schedule 28.02.2013
comment
Чувак, большое спасибо за ответ, но я знал, что забыл упомянуть кое-что в своем посте, что на самом деле очень важно — › Фреймворк. Я работаю на Glassfish, имею БД на сервере MySQL и использую EJB и, конечно же, JPA. - person Devil; 01.03.2013
comment
Нет проблем, Дьявол. Вы должны быть в состоянии перевести это решение в JPA Criteria API. БД не должно иметь значения. - person carbontax; 01.03.2013