Criteria中的setResultTransformer

use*_*944 21 hibernate criteria hibernate-criteria

标准API中setResultTransformer方法的用途是什么?有人可以用一个简单的例子来解释这个吗 我读了javadocs,但我无法清楚地理解它们.

问候,

car*_*tax 14

不使用setProjections()的Criteria查询的默认ResultTransformer将是ROOT_ENTITY.

如果我们在与Department的ManyToMany关系中有Student,则查询可能如下所示...

    Session session = (Session) getEntityManager().getDelegate();
    Criteria crit = session.createCriteria(Student.class)
        .createAlias('departments', 'department');
Run Code Online (Sandbox Code Playgroud)

此查询将返回重复项.但是设定ResultTransformer为......

    crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)

现在,当Hibernate对结果进行编组时,结果将是截然不同的.(或者我是指unmarshalls?)

如果您不希望Hibernate将查询作为a返回,List<Student>而是希望以List<Object[]>当时的方式处理结果

    crit.setResultTransformer(CriteriaSpecification.PROJECTION)
Run Code Online (Sandbox Code Playgroud)

  • 从文档中,我可以看到ROOT_ALIAS的这个术语:引用条件查询的"根"实体的别名.在这种情况下,术语"根"代表什么?在这种情况下,我无法理解root指的是什么.请解释. (2认同)
  • "root"代表您在创建Criteria实例时使用的任何类.在我的例子中,根是学生.因此,通过调用crit.list()作为Student对象列表将返回结果.除非你要求ResultTransformation作为PROJECTION,否则它将是一个Object对象列表.(另外,我正在编辑我的原始示例以删除限制,以便查询将返回重复项.) (2认同)

App*_*esh 8

简单地说:当您执行Criteria时:您希望结果集成为特定对象,您可以使用它:例如:

 .setResultTransformer(Transformers.aliasToBean(Employee.class));
Run Code Online (Sandbox Code Playgroud)

Employee 应该与ResultSet实体匹配 .