在我的数据库中,我有一个Test表,其中包含列:testName,testType 有两种不同的测试,使用相同的类型即“SUN”,所以我只希望其中一个在我的hibernate / criteria中使用Distinct,如下所示,但它仍然给我两个与“sun”同名的类型。
Criteria crit = session.createCriteria(Test.class);
final ResultTransformer trans = new DistinctRootEntityResultTransformer();
crit.setResultTransformer(trans);
List rsList = trans.transformList(crit.list());
任何想法可能是什么原因,或任何其他过滤重复的方式。
答案 0 :(得分:24)
使用Projections.distinct。
Criteria crit = session.createCriteria(Test.class).setProjection(
Projections.distinct(Projections.projectionList()
.add(Projections.property("type"), "type") )
.setResultTransformer(Transformers.aliasToBean(YourBean.class));
List lst = crit.list();
其中YourBean.class具有属性“type”。返回的列表将为List<YourBean>
。
答案 1 :(得分:14)
尝试使用:
cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
它非常适合我
答案 2 :(得分:4)
我终于找到了获取其他列的值:
Criteria criteria = session.createCriteria(Test.class);
ProjectionList projectionList = Projections.projectionList();
ProjectionList projectionList2 = Projections.projectionList();
projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn")));
projectionList2.add(Projections.property("col1"), "col1");
projectionList2.add(Projections.property("col2"), "col2");
criteria.setProjection(projectionList2);
criteria.setResultTransformer(Transformers.aliasToBean(Test.class));
List list = criteria.list();
答案 3 :(得分:1)
遇到同样的问题,最后使用Group By投影解决,然后添加我需要的所有列。例如
Criteria query = session.createCriteria(Class.class)
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("Col1"), "Col1")
.add(Projections.groupProperty("Col2"), "Col2"))
.setResultTransformer(Transformers.aliasToBean(Class.class));
List list = query.list();
答案 4 :(得分:1)
尝试使用:
Criteria criteria =
session.createCriteria(Test.class).setProjection(
Projections.distinct(Projections.property("testType")));
List<Test> rsList = criteria.list();
答案 5 :(得分:0)
预测仅提供标记属性的结果。但是,它会给子实体带来问题。请看我的帖子,了解我遇到的真正问题。
答案 6 :(得分:0)
尝试
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Criteria crit = session.createCriteria(Test.class);
List list = crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
答案 7 :(得分:0)
尝试使用:
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
它使用默认的哈希码来查找结果中的匹配项。
谢谢。