在Hibernate 4中使用Criteria API的复杂查询

问题描述 投票:0回答:2

我正在使用带有条件API的hibernate 4,我正面临一个复杂的查询。

我的关系模型如下:

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的最大数量。

java hibernate criteria
2个回答
0
投票

你可能想尝试一个DetachedCriteria,让它返回你的“n”上一个ShoppingEvent的id,然后在你的标准中你添加一个限制,你的article.shoppingEvent必须匹配你的detachedCriteria中的id列表。


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”ShoppingEvent的所有文章

为此,只需在.setMaxResults(n)中指定“n”即可。

© www.soinside.com 2019 - 2024. All rights reserved.