2016-07-31 9 views

Antwort

0

versuchen diese

 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 
} 
+0

das Problem ist, dass der Alias ​​"ID" heißt "ID" in der Klasse – Khodabakhsh

+0

yeah Sie können Annotation dort @id hinzufügen auf diese Weise wird es dto –

+0

zuordnen, was ist mit Beschreibung? – Khodabakhsh

0

Was ich wahrscheinlich Wiederverwendung zu maximieren tun würde, wäre meine eigene ResultTransformer zu schreiben, die Sie vor dem Ausführen Ihrer Abfrage und als Teil dieser Implementierung instanziiert könnte, sind Sie verpflichtet, geben Sie ihm die entsprechenden Zuordnungsinformationen an.

// 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(); 

Hier ist ein Beispiel, wie der Transformator aussehen könnte.

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; 
    } 
} 

Die Schönheit hier ist, dass diese Klasse vollständig wiederverwendbar ist, ist es nicht auf eine bestimmte Klasse oder Abfrage gebunden. Sie könnten dann darauf erweitern und möglicherweise Unterstützung für verschachtelte Eigenschaften usw. hinzufügen.

+0

Nein, ich zeigte Ihnen, wie die 'BasicTransformerAdapter', die eine NOOP (tut nichts) Implementierung von' ResultTransformer' in eine wiederverwendbare Komponente für Situationen erweitert werden kann so was. Bitte lies was ich geschrieben habe. – Naros

Verwandte Themen