Простой Hibernate aliasToBean () не работает - PullRequest
5 голосов
/ 22 декабря 2010

Следующий код не работает для меня:

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


Забавно, что если я удаляю setResultTransformer(), я получаю список имен пользователей, возвращенных обратно отлично.

Вот мой класс 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;
    }
}


Мысли?

Ответы [ 2 ]

9 голосов
/ 22 декабря 2010

Исправлено.

Пришлось изменить мою проекцию, чтобы она выглядела так ...

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

Странно ... но все, что работает, я думаю.

5 голосов
/ 04 мая 2012
.add(Projections.property("userName"), "userName");

.. является правильным в этой ситуации.

Метод aliasToBean() создает ResultTransformer , который будет вводить псевдонимы в экземпляры класса UserSummary с помощью методов или полей свойств. Второй параметр метода add() - это то, где указывается прогнозируемый псевдоним свойства . Здесь вы указали 'userName', которое является свойством в классе UserSummary, которому будет отображаться проецируемое свойство. Вот почему это не сработало в первую очередь. Библиотека Hibernate не знает, какое поле / установщик UserSummary сопоставить свойству. Уберите метод aliasToBean(), и он не будет пытаться делать какие-либо сопоставления. Итак, если кто-то имел:

private String userFullName;

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

public String getUserFullName() {
   return userFullName;
}

Метод add() будет выглядеть следующим образом:

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

Пока оба userName класса User и userFullName класса UserSummary используют один и тот же тип , вы хороши идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...