Hibernate Criteria - 返回列不同的记录

Kyl*_*leM 5 java hibernate criteria-api

示例数据库表:

  1. ID = 1,msgFrom ='你好',foobar ='meh'
  2. ID = 2,msgFrom ='再见',foobar ='评论'
  3. ID = 3,msgFrom ='Hello',foobar ='response'

示例所需输出(由hibernate查询生成):

  1. ID = 1,msgFrom ='你好',foobar ='meh'
  2. ID = 2,msgFrom ='再见',foobar ='评论'

在上面的示例中,第三条记录将从结果中排除,因为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");
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是要对数据库上的不同记录进行过滤,所以我对我必须在应用程序服务器上过滤任何内容的答案不感兴趣.

编辑:文章基本上显示了我想要做的事情.http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/

Jav*_*a P 6

请试试这个并告诉我

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());
}
Run Code Online (Sandbox Code Playgroud)