Spring-Data JPA: как сделать запрос критериев jpa

Учитывая эти две сущности:

post         post_category
  - id         - post_id
  - title      - name
  - text

Я хотел бы сделать этот запрос, используя запрос критериев jpa:

select * from post
where post.id in (
  select post_id from post_category
  where name = '<category1>' and name = '<category2>' ... and name = '<categoryN>')

person qopuir    schedule 15.01.2013    source источник
comment
Взгляните на часто задаваемые вопросы о том, какие вопросы допустимы на SO: stackoverflow.com/faq. В настоящее время этот вопрос является открытым - мы не готовы писать код для вас.   -  person Jon Egerton    schedule 15.01.2013
comment
Аналогичный здесь - stackoverflow.com/a/13912967/366964 с некоторыми изменениями для быстрого запуска.   -  person Nayan Wadekar    schedule 15.01.2013


Ответы (1)


Глядя на эскиз вашего запроса, я думаю, что он не даст никаких результатов. Вместо этого я изменил его на name in ('<category1>','<category2>', ...). Что может не совпадать с вашим случаем.

Это предполагает, что у вас правильно настроено сопоставление в ваших классах для работы JPA. Например

    class PostCategory {
        private String name;
        private Post post;
        ...
        @ManyToOne
        public Post getPost() {
            return post;
        }
        ...

В этом случае ваш код DAO будет похож на этот (с учетом объекта List nameValues)

    // Set up the subquery
    DetachedCriteria dc = DetachedCriteria.forClass(PostCategory.class)
        .setProjection(Projections.property("post.id"))
        .add(Restrictions.in("name", nameValues));

    Criteria crit = session.createCriteria(Post.class)
        .add(Subqueries.eqProperty("id", dc));

Но если вам нужен список объектов Post, которые имеют ВСЕ категории, вам нужно будет создать отдельный экземпляр DetachedCriteria для каждой категории и добавить каждый в качестве подзапроса AND.

person carbontax    schedule 16.01.2013