Java 如何在hibernate中将本机SQL查询映射到dto对象?
我有以下本机SQL查询: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
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
的实现可以扩展为一个可重用的组件,用于类似的情况。请读我写的。