我正在使用带有条件API的hibernate 4,我正面临一个复杂的查询。
我的关系模型如下:
我想要做的是在指定日期之前为给定的人获取属于“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
的最大数量。
你可能想尝试一个DetachedCriteria,让它返回你的“n”上一个ShoppingEvent的id,然后在你的标准中你添加一个限制,你的article.shoppingEvent必须匹配你的detachedCriteria中的id列表。
如果您根据文章构建查询会更容易,它将是这样的:
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的所有文章
为此,只需在.setMaxResults(n)中指定“n”即可。