Criteria criteria = baseDao.createCriteria(TbEbillDataDetail.class);
criteria.setProjection(Projections.distinct(Projections.property("cardNo")));
这样虽然是去掉cardNo的重复记录了 但是只能得到cardNo字段的记录,而且hibernate还会自动给这个字段加一个别名
这是控制台打印出的语句:select distinct this_.V_CARDNO as y0_ from table_test this_
所以在JSP页面如果按cardNo来显示 根本就显示不出来。
我想要的就是通过criteria 设置去掉一个字段的重复值 同时查询出该表中的所有信息(条件是在cardNo不重复的情况下)求高人教教该怎么写
criteria.setProjection(Projections.distinct(Projections.property("cardNo")));
这样虽然是去掉cardNo的重复记录了 但是只能得到cardNo字段的记录,而且hibernate还会自动给这个字段加一个别名
这是控制台打印出的语句:select distinct this_.V_CARDNO as y0_ from table_test this_
所以在JSP页面如果按cardNo来显示 根本就显示不出来。
我想要的就是通过criteria 设置去掉一个字段的重复值 同时查询出该表中的所有信息(条件是在cardNo不重复的情况下)求高人教教该怎么写
非要用criteria吗 criteria是什么我还真不知道 但是使用HQL我可以分组统计
String hql = "select p.name,p,publishDate,count(id) from Popularize p group by p.name,p.publishDate order by id desc";
Query query = getSession().createQuery(hql);
以下为取值部分:
List list = query.list();//注意不要用泛型
for(int i = 0;i<list.size();i++){
Object[] obj = (Object[])list.get(i);//如果你将统计数字 和 数据一起select 那么这里就是一个Object数组
System.out.println(obj[0]);
System.out.println(obj[1]);
System.out.println(obj[2]);
System.out.println(obj[3]);
System.out.println(obj[4]);
......
无限打印下去,知道系统报数据越界异常,那么好了 找你需要的信息,按照序号取,没有的信息对应序号不取就完事了。
}
方法很笨 但是的确可用。如果有人会常规方式,请发出来 大家参考
如果现在有一个非常复杂的绘制报表需求,是你用Criteria 非常不容易实现的(你也会用hql或者sql了。)
criteria.add(Restrictions.sqlRestriction("rowid in (select min(a.rowid) from 你的表名 a group by a.重复的字段)"));
Restrictions.sqlRestriction代表 where后面跟的语句,rowid是每张表必有的.所以通过子查询可以将条件过滤掉,只剩下a.重复的字段不重复的所有数据.碰到同样问题的朋友可以参考次方法解决.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
想要得到对象形式的返回,
不妨试试
sqlRestriction("1=1 group by name,age");其他查询条件还可以放,+上 1=1 主要用于没有其他条件的情况下,直接group by name,age汇报语法错误
产生的语句会是 where group by name,age