示例数据库表:
所需输出样本(由休眠查询生成):
在上面的示例中,由于msgFrom列相同,因此第三条记录将从结果中排除。假设Java / Hibernate类称为Message。我希望将结果作为Message对象(或仍然可以转换为Message的对象)的列表返回。我想尽可能使用Criteria API。我在SO上看到了这个示例,它看起来很相似,但是到目前为止我还不能正确实现它。
select e from Message e
where e.msgFrom IN (select distinct m.msgFrom
from Message m
WHERE m.msgTo = ?
AND m.msgCheck = 0");
我这样做的原因是要对数据库上的不同记录进行过滤,因此我对必须过滤应用程序服务器上的所有内容的答案不感兴趣。
编辑:文章基本上显示了我想要做什么。 http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/
最佳答案
请尝试这个,让我知道
DetachedCriteria msgFromCriteria = DetachedCriteria.forClass(Message.class);
ProjectionList properties = Projections.projectionList();
properties.add(Projections.groupProperty("messageFrom"));
properties.add(Projections.min("id"),"id");
msgFromCriteria.setProjection(properties);
Criteria criteria = s.createCriteria(Message.class);
criteria.add(Subqueries.propertiesIn(new String[]{"messageFrom","id"},
msgFromCriteria));
List<Message> list = criteria.list();
for(Message message:list){
System.out.println(message.getId()
+"-------"
+message.getMessageFrom()
+"-----"
+message.getFoobar());
}