【问题标题】:get id with distinct with hibernate criteria获取具有不同休眠条件的 id
【发布时间】:2016-08-11 08:19:05
【问题描述】:

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

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

第 1 批 12,
批次1 45,
批次1 63,
批次2 96,
批次2 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();

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    您似乎在标准中设置了多个预测。最后一个覆盖前面的。为避免这种情况,您可以使用 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(); 
    

    【讨论】:

    • 感谢您的回复,但是是否可以返回所有不同的记录。
    • 我没有理解“所有具有不同的记录”的意思。我发布的上述 sn-p 略有变化。投影列表不需要 distinct 子句。
    • 实际上您的代码不起作用..显示语法异常。
    • 是的。它需要稍作改动。我已经更新了上面的 sn-p。试试看。
    • 我没有得到预期的结果..批处理代码重复超过 2 次。
    【解决方案2】:

    我找到了this question,和你的类似,但还没解决。

    在 cmets 中,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&lt;Object[]&gt;。我不知道您是否会在尝试获取 Key 对象时遇到 ClassCastException

    【讨论】:

      【解决方案3】:

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

      标识 |批号

      1 | abc

      2 | abc

      3 | xyz

      4 | abc

      5 |荷兰皇家航空公司

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-04
        • 2018-04-20
        • 2014-02-04
        • 2017-12-25
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        相关资源
        最近更新 更多