繁体   English   中英

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

[英]Complex query using Criteria API in Hibernate 4

我正在使用带有标准API的休眠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的最大数量。

如果您基于“文章”构建查询,将会更加容易,就像这样:

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”

您可能想尝试一个DetachedCriteria,让它返回上一个ShoppingEvent的“ n”个ID,然后在您的条件中添加一个限制,使您的article.shoppingEvent必须与detachedCriteria中的ID列表匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM