我有以下本机SQL查询:
Select E.id AS ID, E.desc AS DESCRIPTION FROM TEMP E
和dto课程:
private int id;
private String description;
/* getter and setter */
如何获取dto类列表?
答案 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;
}
}
这里的美妙之处在于这个类完全可以重用,它不与任何特定的类或查询绑定。然后,您可以扩展它并添加对嵌套属性等的支持。