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