我一直在寻找一些时间,但没有找到足够的答案自己这样做。
我有一个看起来像这样的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的解决方案,因为动态构建查询,并且使用它们构建更好的解决方案。
答案 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
的使用在巨大的记录集中可能是一个严重的性能瓶颈。