休眠查询以获取具有特定值的列中的条目总数
Hibernate query to get Total number of entries in a column with a specific value
我对休眠还很陌生。所以这对你们来说可能是一个简单的问题。
我有一个名为 BuildHistory 的 Table。在那里我有一个名为 Status 的列。
我想获得 table 状态值为 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;
}
您应该能够将条件聚合与 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 注入。
我对休眠还很陌生。所以这对你们来说可能是一个简单的问题。 我有一个名为 BuildHistory 的 Table。在那里我有一个名为 Status 的列。 我想获得 table 状态值为 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;
}
您应该能够将条件聚合与 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 注入。