Java 使用GROUP BY和RETURN ENTITY LIST休眠条件
我试图在我的标准中使用GROUP BY。我需要这样做:Java 使用GROUP BY和RETURN ENTITY LIST休眠条件,java,hibernate,criteria,Java,Hibernate,Criteria,我试图在我的标准中使用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
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();
此代码返回空值列表。使用条件是否可以做到这一点?首先,projecton会过滤检索到的数据量,如果需要更多数据,也应该将这些属性添加到投影中 例如:
c.setProjection( Projections.projectionList()
.add( Projections.property("id").as("id") )
.add( Projections.property("descripction").as("description") )
.add( Projections.groupProperty("volumeCode").as("volumeCode") ));
现在,转换器执行它对Bean所说的别名,它将别名与JavaBeanBook.java的属性进行匹配
编辑:
如果没有转换器,则投影具有多个属性,结果如下所示:
for(Object[] item:criteria.list()){
System.out.println( (String)item[0] ); //ID
System.out.println( (String)item[1] ); //Description
System.out.println( (String)item[2] ); //Volume code
}
这就是为什么会出现强制转换异常,关于转换器,请尝试将每个别名与java bean的属性名匹配。我认为您可以使用:criteria.setResultTransformerCriteria.DISTINCT\u ROOT\u ENTITY cz_-Nesh。
对不起,我的第一个答案。
我阅读了HibernateAPI并阅读了一些Hibernate源代码,我发现了这一点。
如果你使用这个代码
session.createCriteria(EmpUserImpl.class).list();
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("company").as("company"))
.add(Projections.property("name").as("name"))
.add(Projections.property("company").as("company")));
List list = criteria.list();
它将返回列表EmpUserImpl。
如果你使用这个代码
session.createCriteria(EmpUserImpl.class).list();
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("company").as("company"))
.add(Projections.property("name").as("name"))
.add(Projections.property("company").as("company")));
List list = criteria.list();
它会返回List,不是List EmpUserImpl为什么?
我看到了标准的父类标准规范,我发现了
public interface CriteriaSpecification {
/**
* The alias that refers to the "root" entity of the criteria query.
*/
public static final String ROOT_ALIAS = "this";
/**
* Each row of results is a <tt>Map</tt> from alias to entity instance
*/
public static final ResultTransformer ALIAS_TO_ENTITY_MAP = AliasToEntityMapResultTransformer.INSTANCE;
/**
* Each row of results is an instance of the root entity
*/
public static final ResultTransformer ROOT_ENTITY = RootEntityResultTransformer.INSTANCE;
/**
* Each row of results is a distinct instance of the root entity
*/
public static final ResultTransformer DISTINCT_ROOT_ENTITY = DistinctRootEntityResultTransformer.INSTANCE;
/**
* This result transformer is selected implicitly by calling <tt>setProjection()</tt>
*/
public static final ResultTransformer PROJECTION = PassThroughResultTransformer.INSTANCE;
/**
* Specifies joining to an entity based on an inner join.
*
* @deprecated use {@link org.hibernate.sql.JoinType#INNER_JOIN}
*/
@Deprecated
public static final int INNER_JOIN = JoinType.INNER_JOIN.getJoinTypeValue();
/**
* Specifies joining to an entity based on a full join.
*
* @deprecated use {@link org.hibernate.sql.JoinType#FULL_JOIN}
*/
@Deprecated
public static final int FULL_JOIN = JoinType.FULL_JOIN.getJoinTypeValue();
/**
* Specifies joining to an entity based on a left outer join.
*
* @deprecated use {@link org.hibernate.sql.JoinType#LEFT_OUTER_JOIN}
*/
@Deprecated
public static final int LEFT_JOIN = JoinType.LEFT_OUTER_JOIN.getJoinTypeValue();
}
您能看到公共静态最终结果变压器投影吗?它说这个结果转换器是通过调用setProjection隐式选择的
是指当您使用criteria.setProjection时,结果不会列出EmpUserImpl,因为ResultTransformer已从根实体更改为投影。它将按Projectionlike select name、oid。
所以,如果您想返回List EmpUserImpl,您需要设置Projections.propertyname.asname.,如果您需要name,只需要设置name。
这是我的密码
Criteria criteria = session.createCriteria(EmpUserImpl.class);
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("company").as("company"))
.add(Projections.property("name").as("name"))
.add(Projections.property("company").as("company")));
criteria.setResultTransformer(Transformers.aliasToBean(EmpUserImpl.class));
List<EmpUserImpl> list = criteria.list();
for (EmpUserImpl empUserImpl : list) {
System.out.println(empUserImpl.getName());
}
它可以工作。希望能对您有所帮助。您好,齐尔,谢谢您的回复。根据您的建议,我得到了对象列表,但当我试图将列表中的任何对象强制转换到Book时,Java抛出异常。Ehm,我删除了带有transformer O:-。。。在加回这一行之后,我仍然得到了空对象的列表。感谢您编辑您的帖子。我不想只得到一个财产,而是整个物品。我需要得到相同的对象列表,比如在调用SelectB fromBook b GROUP BY volumeCode之后,结果应该是list然后你需要让transformer工作,只需将Bean的每个属性添加到投影中,并使用与alias和property同名的匹配别名,它就会工作。当你按卷代码分组时,您不应该也按所有其他属性、id和描述进行分组吗?或者将它们放在某个聚合函数中?@rayryeng我遇到了相同的问题,试图通过personId使用条件从person p组中获取SELECT p,但使用setProjection它只是将其转换为sql等效的SELECT distintpersonId FROM person并返回personId列表,我需要整个person对象和list list list=session.createCriteriaPerson,p.setResultTransformerCriteria.DISTINCT\u ROOT\u实体;返回person对象的列表。至于为什么和如何希望这将有助于添加到您的帖子。我们不知道为什么这对你有帮助我正在得到所有物品的清单。但是所有字段都是空的。你知道为什么会这样吗?