2010-12-21 13 views
5

El siguiente código no está funcionando para mí:simple Hibernate aliasToBean() no funciona

List results = getSession().createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
      .add(Projections.property("userName")) 
    ) 
    .setResultTransformer(Transformers.aliasToBean(UserSummary.class)) 
    .list(); 


divertido suficiente, sin embargo si quito el setResultTransformer() puedo obtener una lista de nombres de usuario devuelve de nuevo perfectamente bien.

Aquí es mi clase UserSummary:

public class UserSummary { 

    private String userName; 
    private String clickUrl; 
    private Integer id; 

    public UserSummary() {} 

    public UserSummary(Integer id, String userName) { 
     this.id = id; 
     this.userName = userName; 
     this.clickUrl = clickUrl; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public String getClickUrl() { 
     return clickUrl; 
    } 

    public void setClickUrl(String clickUrl) { 
     this.clickUrl = clickUrl; 
    } 

    public Integer getId() { 
     return id; 
    } 
} 


Pensamientos?

Respuesta

8

Se arregló.

tenía que cambiar mi proyección por lo que se veía así ..

.add(Projections.property("userName"), "userName") 

Odd .. pero lo que funcione supongo.

5
.add(Projections.property("userName"), "userName"); 

..es correcta en esta situación.

El método aliasToBean() crea un ResultTransformer que inyectará valores alias en instancias de la clase UserSummary a través de métodos de propiedad o campos. El segundo parámetro del método add() es donde se especifica el alias de propiedad proyectado. Aquí ha especificado 'userName', que es la propiedad en la clase UserSummary a la que se asignará la propiedad proyectada. Es por eso que no funcionó en primera instancia. La lib de Hibernate no sabía para qué UserSummary field/setter asignar la propiedad. Elimine el método aliasToBean() y no va a intentar hacer ningún mapeo. Por lo tanto, si uno tenía:

private String userFullName; 

public UserSummary(Integer id, String userFullName) { 
    this.id = id; 
    this.userFullName = userFullName; 
    this.clickUrl = clickUrl; 
} 

public String getUserFullName() { 
    return userFullName; 
} 

El método add() sería la siguiente:

.add(Projections.property("userName"), "userFullName"); 

Mientras tanto nomUsuario de la clase de usuario y userFullName de clase UserSummary están utilizando los mismos tipo eres bueno para ir.

Cuestiones relacionadas