我有一个关于在Hibernate中使用限制的问题。
我必须创建条件,设置一些限制,然后选择一条最大值为Date字段的记录:
Criteria query = session.createCriteria(Storage.class)
query.add(Restrictions.eq(USER_ID, item.getUserId()));
query.add(Restrictions.eq(ITEM_ID, item.getItemId()));
query.add(Restrictions.lt(PURCHASE_DATE, item.getDate()));
query.setProjection(Projections.max(PURCHASE_DATE));
return query.uniqueResult();
据我所知,预测不会给我带来最大日期的记录。 我应该选择什么方法?
也许我可以在查询中添加顺序(在日期字段中按升序排列),然后选择第一个结果?
或者你可以建议更优雅的解决方案吗?
谢谢!
答案 0 :(得分:7)
在你的情况下,你可以去
A)使用DetachedQuery。如,强>
DetachedCriteria maxQuery = DetachedCriteria.forClass( Storage.class );
maxQuery.add(Restrictions.eq(USER_ID, item.getUserId()));
maxQuery.add(Restrictions.eq(ITEM_ID, item.getItemId()));
maxQuery.add(Restrictions.lt(PURCHASE_DATE, item.getDate()));
maxQuery.setProjection( Projections.max( "PURCHASE_DATE" ) );
Criteria query = getSession().createCriteria( Storage.class );
query.add(Restrictions.eq(USER_ID, item.getUserId()));
query.add(Restrictions.eq(ITEM_ID, item.getItemId()));
query.add( Property.forName( "PURCHASE_DATE" ).eq( maxQuery ) );
在处理分离的查询时,请记住事务!
有关分离查询的更多详细信息,请参阅文档的第15章:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html
B)直接使用HQL或SQL,以便进行子选择。
有关HQL的更多详细信息,请参阅Hibernate文档的第14章:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html