我正在使用带有标准API的休眠4,并且面临着一个复杂的查询。
我的关系模型如下:
我要做的是为给定的人获取在指定日期之前最后ShoppingEvent
内属于“ n”个物品的所有已运送的物品。
如何使用标准API做到这一点?
n.b。我已经尝试过类似的操作:
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
的最大数量。
答案 0 :(得分:0)
如果您根据“文章”构建查询,将会更加容易,就像这样:
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”个购物事件
要执行此操作,只需在 .setMaxResults(n)
中指定“ n”答案 1 :(得分:0)
您可能想尝试一个DetachedCriteria,让它返回上一个ShoppingEvent的“ n”个ID,然后在您的条件中添加一个限制,即article.shoppingEvent必须与detachedCriteria中的ID列表匹配。