Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 如何在hibernate中将本机SQL查询映射到dto对象?_Java_Sql_Hibernate_Orm - Fatal编程技术网

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

Java 如何在hibernate中将本机SQL查询映射到dto对象?,java,sql,hibernate,orm,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类的列表???试试这个 Query query = getSession.createSQLQuery("...") .addScalar("ID") .addScala

我有以下本机SQL查询:

Select E.id AS ID, E.desc AS DESCRIPTION FROM TEMP E
和dto类:

private int id;
private String description;
/* getter and setter */
如何获取dto类的列表???

试试这个

     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 
}
Query Query=getSession.createSQLQuery(“…”)
.addScalar(“ID”)
.addScalar(“描述”)
.setResultTransformer(Transformers.aliasToBean(dto.class));
List=query.List();
dto类
@实体
@表(name=“您的数据库表”)
公共类DTO{
@身份证
私有整数id
@列(name=“description\u name\u on\u table)
私有字符串描述
…接二连三
}

为了最大限度地实现重用,我可能会编写自己的
结果转换器
,您可以在运行查询之前对其进行实例化,并且作为此实现的一部分,您需要为其提供适当的映射信息

// 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;
  }
}
公共类MappedResultTransformer扩展基本TransformerAdapter{
final Map fieldMappings=new HashMap();
最后一节课;
公共配电变压器(clazz级){
this.clazz=clazz;
}
公共无效映射(字符串别名、字符串属性){
fieldMappings.put(别名、属性);
}
@凌驾
公共对象转换元组(对象[]元组,字符串[]别名){
对象结果=clazz.newInstance();
对于(int i=0;i

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

问题在于别名“ID”被命名为“ID”“在classyeah中,您可以在那里添加注释@id,这样它将映射到关于描述的数据?有没有忽略大小写的方法?@column(name=“database\u description\u field\u name”)放在描述上否,我向您展示了如何使用
基本TransformerAdapter
,这是一个NOOP(不做任何事情)
ResultTransformer
的实现可以扩展为一个可重用的组件,用于类似的情况。请读我写的。