【问题标题】:Hibernate count rows with some criterias具有某些条件的休眠计数行
【发布时间】:2011-11-29 12:14:53
【问题描述】:

假设我有一个表格 Person 并且我想计算所有那些“birthDate”不为空并且他们是学生的人。 假设我有两列:

birthDate Date (can be null)
isStudent boolean (default: false)

我怎样才能使用休眠.. 做到这一点?

【问题讨论】:

标签: java hibernate


【解决方案1】:
Criteria crit = session.createCriteria(Person.class);
crit.add( Restrictions.isNotNull("birthDate"));
crit.add( Restrictions.eq("isStudent", true));
crit.setProjection(Projections.rowCount());
Integer count = (Integer)crit.uniqueResult();

【讨论】:

  • 如果他还想在同一个查询中查看 isDropout 的计数怎么办?
  • 如果你想要两个独立的计数,你必须使用联合或子查询,从而在休眠中使用一些别名。因为您需要根据特定标准进行分组
【解决方案2】:
Criteria crit = session.createCriteria(Person.class);
crit.add( Restrictions.isNotNull("birthDate"));
crit.add( Restrictions.eq("isStudent", true));
List<Person> students = crit.list();
Integer count = students.size();

或者如果只想要一个计数值,并且没有返回列表:

Criteria crit = session.createCriteria(Person.class);
crit.setProjection(Projections.rowCount());
crit.add( Restrictions.isNotNull("birthDate"));
crit.add( Restrictions.eq("isStudent", true));
return (Long) crit.uniqueResult(); 

【讨论】:

  • 您获取整个列表只是为了知道它的大小?一个基本的 HQL 查询就足够了,为什么还要使用 Criteria?
  • @JB Nizet 因为我可能也会将该列表用于其他逻辑
  • 我更喜欢标准而不是连接字符串,如果您将 sql 写成字符串,恕我直言,这有点违背了休眠的目的。
  • 条件没问题,但是没有理由为单次计数操作获取所有结果:想想当你有一个有 1000+ 个结果的查询时,Hibernate 会花费很多时间来填充只对结果数量感兴趣的列表
【解决方案3】:
Number count = (Number) session.createQuery(
    "select count(p.id) from Person p"
    + " where p.birthDate is not null and p.isStudent = true").uniqueResult();

【讨论】:

    【解决方案4】:
    int result= (int)((long)session.createQuery("select count(p) from User p where p.mobileNumber = :pMobileNumber")
                     .setParameter("pMobileNumber", mobileNumber).uniqueResult());
    

    【讨论】:

      【解决方案5】:

      使用它。它正在工作

      public class IncIncidentListGridModel
      {
      
          private String historyStatus = null;
      
          public String getHistoryStatus()
          {
              return historyStatus;
          }
      
          public void setHistoryStatus(String historyStatus)
          {
              this.historyStatus = historyStatus;
          }
      
          public void run()
          {
              IncIncidentListGridModel resultCount =
                  (IncIncidentListGridModel) ((SQLQuery) hibersession
                      .createSQLQuery("select count(ch.incident_capa_history_id) as historyStatus  from incident_capa_history ch, incident_capa ic where ic.incident_capa_id = ch.FK_incident_capa_id and ic.incident_capa_id='011'"))
                      .addScalar("historyStatus", Hibernate.STRING)
                      .setResultTransformer(
                          Transformers.aliasToBean(IncIncidentListGridModel.class))
                      .uniqueResult();
      
              System.out.println("count result" + resultCount.getHistoryStatus());
          }
      }
      

      【讨论】:

      • 请正确格式化答案,而不仅仅是部分答案。
      • “使用它。它正在工作”不是一个有用的评论。为什么有人会认为发布的答案不起作用?
      【解决方案6】:
      Criteria crit = session.createCriteria(Person.class);
      crit.setProjection(Projections.rowCount());
      crit.add( Restrictions.isNotNull("birthDate"));
      crit.add( Restrictions.eq("isStudent", true));
      return (Long) crit.uniqueResult();
      

      (Long)crit.uniqueResult() 将导致 NonUniqueResultException。 我检查了 crit.list()。它是一个有 2 个项目的 ArrayList。 arraylist 的第一项包含计数。第二项总是包含一个0。它是rowCount的预期结果吗?

      谢谢

      【讨论】:

        猜你喜欢
        • 2017-12-25
        • 2016-10-04
        • 2014-02-04
        • 1970-01-01
        • 2011-06-30
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        相关资源
        最近更新 更多