Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GROUP BY和RETURN ENTITY LIST休眠条件_Java_Hibernate_Criteria - Fatal编程技术网

Java 使用GROUP BY和RETURN ENTITY LIST休眠条件

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

我试图在我的标准中使用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();

此代码返回空值列表。使用条件是否可以做到这一点?

首先,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对象的列表。至于为什么和如何希望这将有助于添加到您的帖子。我们不知道为什么这对你有帮助我正在得到所有物品的清单。但是所有字段都是空的。你知道为什么会这样吗?