如何在hibernate中将本机SQL查询映射到dto对象?

时间:2016-07-31 11:30:34

标签: java sql hibernate orm

我有以下本机SQL查询:

Select E.id AS ID, E.desc AS DESCRIPTION FROM TEMP E

和dto课程:

private int id;
private String description;
/* getter and setter */

如何获取dto类列表?

2 个答案:

答案 0 :(得分:0)

试试这个

     Query query = getSession.createSQLQuery("...")
     .addScalar("ID")
     .addScalar("DESCRIPTION")
     .setResultTransformer(Transformers.aliasToBean(dto.class));
     List<dto> list = query.list();



    dto class 
    @Entity
    @Table(name="your database table")
    public class DTO {

    @Id
    private int id
    @Column(name="description_name_on_table)
    private String description
    ..getter and setter 
}

答案 1 :(得分:0)

我可能会做的最大化重用是编写我自己的ResultTransformer,您可以在运行查询之前进行实例化,作为此实现的一部分,您需要提供它适当的地图信息。

// construct the transformer and register mappings
MappedResultTransformertransformer = new MappedResultTransformer(DtoClass.class);
transformer.map( "ID", "id" );
transformer.map( "DESCRIPTION", "description" );

// apply the transformer
session.createQuery( ... ).setResultTransformer( transformer ).list();

以下是变压器外观的示例。

public class MappedResultTransformer extends BasicTransformerAdapter {
  final Map<String, String> fieldMappings = new HashMap<>();
  final Class<?> clazz;

  public MappedResultTransformer(Class<?> clazz) {
    this.clazz = clazz;
  }

  public void map(String alias, String property) {
    fieldMappings.put( alias, property );
  }

  @Override
  public Object transformTuple(Object[] tuple, String[] aliases) {
    Object result = clazz.newInstance();
    for ( int i = 0; i < aliases.length; ++i ) {
      Object tupleValue = tuple[ i ];
      String alias = aliases[ i ];
      String propertyName = fieldMappings.get( alias );
      if ( propertyName != null ) {
        // use reflection to set the value of 'propertyName' on 'result'
      }
    }
    return result;
  }
}

这里的美妙之处在于这个类完全可以重用,它不与任何特定的类或查询绑定。然后,您可以扩展它并添加对嵌套属性等的支持。