Загрузка частичных данных в дочерний объект с использованием проекций спящего режима - PullRequest
0 голосов
/ 03 января 2019
class User{
    int id;
    String firstName;
    String lastName;
    List<Address> address ;
}

class Address{
    int id;
    String city;
    String state;   
}

Я хочу загрузить частичные данные из класса Address, используя критерии гибернации или HQL.В этом случае я хочу загрузить только идентификатор и состояние адреса из класса Address.Я понял, что могу частично загрузить данные, используя проекции, но я не знаю, что можно сделать с классом адресов.

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.projectionList()
.add(Projections.property("id"),"id")
.add(Projections.property("firstName"),"firstName")
.add(Projections.property("address"),"address")

Если я попытаюсь ограничить загрузку данных в классе адресов с помощью проекций

.add(Projections.property("address.id"),"address.id")

Я получаю сообщение об ошибке, поскольку в классе пользователя отсутствует address.id объекта.Буду признателен за любую помощь в этом.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я использовал язык запросов Hibernate (HQL) для достижения желаемого результата.

Сначала я создал экземпляр класса пользователя и добавил новый конструктор, как показано ниже

List<User> userList = new ArrayList<User>();

        try {
            session = HibernateUtil.getSession();
            String hql = "select new User(user.id, user.firstName, user.address.id, user.address.state " 
                    + "from User user where user.id in (:userIdList) ";
            Query q = session.createQuery(hql);
            q.setParameterList("userIdList",userIdList);
            userList=q.list();
            session.flush();
        }

Тогда нам нужно обновить конструктор пользователя как:

public User(int id, String firstName, int addressId, String state) {
    this.id = id;
    this.firstName = firstName;
    this.address = new Address();
    this.address.setState(state);
    this.address.setId(addressId);

Это загрузит только те данные, которые нам нужны.

0 голосов
/ 03 января 2019

Вы можете создать новый класс, скажем AddressId, который содержит только атрибут Long.Правильно сопоставьте этот новый класс с адресной таблицей.Добавить список AddressId в класс пользователя.Используйте прогнозы для загрузки этого нового списка, а не другого.

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