使用多列计算不同选择的行

时间:2015-05-11 09:24:17

标签: hibernate distinct hibernate-criteria

我一直在寻找一些时间,但没有找到足够的答案自己这样做。

我有一个看起来像这样的MsSQL:

select count(*) from 
   ( select distinct supplierName, supplierNr
   from dbo.InvoiceTypeBean
   ) as a

这将返回我想要的纯SQL

但是我需要在hibernate中使用标准和/或detachedcriteria:

分离的标准部分:

DetachedCriteria dCriteria = DetachedCriteria.forClass(clazz);
ProjectionList p = Projections.projectionList();
p.add(Projections.property("supplierName"));
p.add(Projections.property("supplierNr"));
dCriteria.setProjection(Projections.distinct(p));

问题是将其附加到标准:

Criteria criteria = session.createCriteria(clazz);
.... Some atachement
criteria.setProjection(Projections.rowCount());
int count = ((Number) criteria.uniqueResult()).intValue();

我真的需要使用Criteria和/或DetachedCriteria的解决方案,因为动态构建查询,并且使用它们构建更好的解决方案。

2 个答案:

答案 0 :(得分:1)

很好地找到了解决方案,我真正需要的只是在多列上使用distinct时输出的行数(我可以更好地指定)。

感兴趣的解决方案:

session.beginTransaction();
Criteria criteria = session.createCriteria(clazz);

ProjectionList p = Projections.projectionList();
p.add(Projections.property("supplierName"));
p.add(Projections.property("supplierNr"));
criteria.setProjection(Projections.distinct(p));

criteria.setResultTransformer(Transformers.TO_LIST);

ScrollableResults results = criteria.scroll();
results.last();
count = results.getRowNumber() + 1;
results.close();
session.getTransaction().commit();

其中有趣的部分是scrollableresult并且没有使用DetachedCriteria。

答案 1 :(得分:0)

我不确定,但我认为ScrollableResults的使用在巨大的记录集中可能是一个严重的性能瓶颈。