我试着在我的标准中使用GROUP BY
。我需要这样做:
SELECT b FROM Book b GROUP BY volumeCode;
我有以下代码:
Criteria c = s.createCriteria(Book.class);
c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode")));
List<Book> result = c.list();
但是这个条件只返回volumeCode
s(字符串列表)。我需要一份Book
的列表。所以我试着用变形金刚:
Criteria c = s.createCriteria(Book.class);
c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode")));
c.setResultTransformer(Transformers.aliasToBean(Book.class));
List<Book> result = c.list();
此代码返回空值列表。有没有可能用标准来做到这一点?
3条答案
按热度按时间3phpmpom1#
首先,projecton过滤了检索到的数据量,如果你想要更多的数据,你也应该将这些属性添加到投影中。
范例:
现在,Transformer完成了它所说的“将数据转换为Bean”,它与Java Bean的属性“Book.java“进行别名匹配。
编辑:
如果没有Transformer,如果投影具有多个属性,则结果如下所示:
这就是为什么你会得到强制转换异常,关于Transformer,尝试匹配每个别名与你的java bean的属性名。
pxiryf3j2#
cz_Nesh.对不起我的第一个答案。我读了Hibernate的API,读了一些Hibernate的源代码,我发现。如果使用此代码,
它将返回List EmpUserImpl。如果使用此代码,
它会返回List,不是List EmpUserImpl为什么?我看到了criterion的父类CriteriaSpecification。
}
你能看到公共静态最终ResultTransformer PROJECTION吗?它说这个结果Transformer是通过调用setProjection()隐式选择的,这意味着当你使用criteria.setProjection时,结果不会列出EmpUserImpl,因为ResultTransformer是从“ROOT_ENTITY”改为“PROJECTION”的。它将按Projection打包(像选择名称,oid.).所以,如果你想返回List EmpUserImpl,你需要设置Projections.property(“name”).as(“name”).,(如果你需要name,只需设置name).这是我的密码。
它能起作用。希望对您有所帮助。
iq0todco3#
我想你可以用途: