【问题标题】:Hibernate query to get Total number of entries in a column with a specific value休眠查询以获取具有特定值的列中的条目总数
【发布时间】:2017-07-12 00:21:11
【问题描述】:

我对休眠很陌生。所以这对你们来说可能是一个简单的问题。 我有一个名为 BuildHistory 的表。在那我有一个名为状态的列。 我想获取该表中状态值为 SUCCESS 的条目总数。

更新

这是我用来获取计数的方法。

public Object countStatus(String sql){
    Session session = HibernateServeletContextListner.sessionFactory_Dummy.openSession();
    Transaction tx = null;

    try {
        tx = session.beginTransaction();
        Query query = session.createQuery("select sum(case when bh.status = :"+sql+" then 1 else 0 end) from BuildHistory bh");
        tx.commit();
        //  return query.uniqueResult();
    } catch (HibernateException e) {
        if (tx!=null) tx.rollback();
        e.printStackTrace(); 
    } finally {
        session.close(); 
    }

    return 0;
}

【问题讨论】:

    标签: sql hibernate oracle11g hql


    【解决方案1】:

    您应该能够将条件聚合与 HQL 一起使用。像下面这样的东西应该可以工作:

    select sum(case when bh.status = :success then 1 else 0 end)
    from BuildHistory bh
    

    您可以使用以下 Java 代码:

    String hql = "select sum(case when bh.status = :status then 1 else 0 end) ";
           hql += "from BuildHistory bh";
    Query query = session.createQuery(hql);
    query.setParameter("status", "success");
    int sum = (Integer)query.uniqueResult();
    

    这里很重要的一点是,我们在此处绑定:status 参数使用准备好的语句动态地进行。在您的原始代码中,您试图将查询连接在一起,这很容易出错和 SQL 注入。

    【讨论】:

    • 那么它会返回什么?计数(整数)还是列表?
    • @sreehari 这应该返回一个计数,您应该可以安全地将其视为 Java 整数。
    • 我运行了如下查询。 Query query = session.createQuery("select sum(case when bh.status = :"+sql+" then 1 else 0 end) from BuildHistory bh");但我得到一个交易异常
    • org.hibernate.TransactionException:事务未成功启动
    • 这听起来与您的实际问题无关。如果你只运行from BuildHistory 会发生什么,你还会收到那个事务错误吗?您也许应该用您正在尝试的实际代码更新您的问题。
    猜你喜欢
    • 2012-07-22
    • 2016-08-25
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2014-12-17
    • 2013-12-30
    相关资源
    最近更新 更多