使用hibernate标准获取不同的id

时间:2016-08-11 08:19:06

标签: java hibernate hibernate-criteria

我想获取具有不同批处理代码和id的行。

以下代码现在提取重复的批处理代码,如:

  

batch1 12,
  batch1 45,
  batch1 63,
  batch2 96,
  batch2 96

@Entity
@Table(name = "key")
public class Key implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, length = 11)
    @Column(name = "batch_code", nullable = false)
    private String batchCode;

    //getter , setter
}



Criteria c = getSession().createCriteria(Key.class);

ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("batchCode"));

c.setProjection(Projections.distinct(projList));
c.setProjection(Projections.property("id"));

if (searchTerm != null && !searchTerm.isEmpty()) {
    c.add(Restrictions.like("keyCode", searchTerm.toUpperCase() + "%"));
}

c.setFirstResult(currPosition);
c.setMaxResults(pageSize);

List<Key> result = c. list();

3 个答案:

答案 0 :(得分:2)

您似乎在标准中设置了多个投影。最后一个覆盖了前一个。为避免这种情况,您可以使用ProjectionList添加多个投影,如下所示

    Criteria c = getSession().createCriteria(Key.class);
    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.distinct(Projections.property("batchCode")));
    projList.add(Projections.property("id"));
    c.setProjection(projList);
      if (searchTerm != null && !searchTerm.isEmpty()) {
          c.add(Restrictions.like("keyCode", searchTerm.toUpperCase() + "%"));
      }
    c.setFirstResult(currPosition);
    c.setMaxResults(pageSize);
    List<Key> result = c. list(); 

答案 1 :(得分:1)

我发现this question与您的相似,但尚未解决。

在评论中,OP表示这一小改变可能是您问题的解决方案:

 ProjectionList projList = Projections.projectionList();
 projList.add(Projections.property("batchCode"));
 projList.add(Projections.property("id"));     
 c.setProjection(Projections.distinct(projList));

另请注意,在上述链接问题中,没有将实体类设置为Criteria

 Criteria c = this.createCriteria();

因此执行list方法会返回List<Object[]>。我不知道你是否会在尝试获取Key个对象

时遇到ClassCastException

答案 2 :(得分:1)

我猜您正在尝试的方案无效。批处理代码和id字段不是复合键的唯一组合。现在在下表中,如果您只需要唯一的批处理代码,您可以创建SQL查询,如“从中选择不同的批处理代码”,但我从对话中了解到的是,您期望完整的记录批处理代码和不同批处理代码的ID。在这种情况下,系统如何确定哪个记录需要为任何重复的批次代码返回,即abc。这里系统没有任何提示是否返回(1,abc)或(2,abc)或(4,abc)。 如果这是用例,那么您需要验证业务场景实际上您要实现的目标。

Id | BatchCode

1 | ABC

2 | ABC

3 | XYZ

4 | ABC

5 | KLM