Сложный запрос с использованием Criteria API в Hibernate 4 - PullRequest
0 голосов
/ 30 августа 2018

Я использую hibernate 4 с API критериев, и у меня сложный запрос.

Моя реляционная модель выглядит следующим образом:

relational model

Я пытаюсь получить для данного лица все отправленные Статьи , которые относятся к «n» в последний раз ShoppingEvent до указанной даты.

Как мне добиться этого с помощью API критериев?

нет. Я уже пробовал что-то вроде:

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("article.articleId"), "articleId");
properties.add(Projections.property("article.price"), "price");
properties.add(Projections.property("article.type"), "type");

return session.createCriteria(Person.class)//
         .add(Restrictions.idEq(person.getPersonId()))//
         .createAlias("articles", "article")//
         .createAlias("article.shoppingEvent", "se")//
         .add(Restrictions.le("se.date", currentDate))//
         .addOrder(Order.desc("se.date"))//
         .setProjection(properties)//
         .setResultTransformer(Transformers.aliasToBean(Articles.class))//
         .list();

Возвращает статьи, которые я хочу, но мне не удается использовать setMaxResults для ограничения максимального числа ShoppingEvents.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Возможно, вы захотите попробовать DetachedCriteria, чтобы он возвращал идентификаторы вашего "n" последнего ShoppingEvent, а затем в ваших критериях вы добавляете ограничение, согласно которому ваш article.shoppingEvent должен соответствовать списку идентификаторов из вашего detachedCriteria.

0 голосов
/ 30 августа 2018

Было бы проще, если бы вы строили свой запрос на основе статьи, это было бы так:

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id"), "articleId");
properties.add(Projections.property("price"), "price");
properties.add(Projections.property("type"), "type");

return session.createCriteria(Article.class) 
 .createAlias("person", "person") 
 .createAlias("shoppingEvent", "shoppingEvent") 
         .add(Restrictions.idEq(person.getPersonId()))  
         .add(Restrictions.le("shoppingEvent.date", currentDate)) 
         .addOrder(Order.desc("shoppingEvent.date")) 
         .setProjection(properties) 
         .setResultTransformer(Transformers.aliasToBean(Articles.class)) 
         .setMaxResults(1)
         .uniqueResult();

Я имею в виду, что я получаю "n" последних статей, но не все статьи последний "n" ShoppingEvent

Для этого просто укажите «n» в .setMaxResults (n)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...