示例数据库表:

  • ID = 1,msgFrom ='Hello',foobar ='meh'
  • ID = 2,msgFrom ='Goodbye',foobar ='comments'
  • ID = 3,msgFrom ='Hello',foobar ='response'

  • 所需输出样本(由休眠查询生成):
  • ID = 1,msgFrom ='Hello',foobar ='meh'
  • ID = 2,msgFrom ='Goodbye',foobar ='comments'

  • 在上面的示例中,由于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());
    }
    

    08-16 22:15