Во многих и многих получает только идентификатор вместо всего объекта - PullRequest
1 голос
/ 02 августа 2020
public class Role {

 @ManyToMany
@JoinTable(name = "user_to_role",
        joinColumns = @JoinColumn(name = "role_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id",referencedColumnName = "id"))
private Set<User> users;
}

public class User {

  @ManyToMany
@JoinTable(name = "user_to_role",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
}

У меня отношения "многие ко многим" между этими двумя классами. При вызове role.getUsers() я хочу получить только идентификаторы пользователей, остальные поля следует игнорировать, так как данных будет много, и я не хочу загружать все, как я могу этого добиться?

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Поскольку вы сопоставили сущности User и Role с помощью отношения @ManyToMany, вам необходимо создать класс DAO / Service для реализации бизнес-логики c, чтобы фильтровать только userIds и возвращать то же самое.

Это не может быть обработано в ваших Model\Entity классах, поскольку это противоречит всей концепции объектно-реляционного сопоставления.

Я могу создать бизнес-логи c, используя DAO для вашего примера, если хотите, но вы получите 10 блогов достигают того же.

Для справки вы можете проверить мой пример проекта здесь .

0 голосов
/ 02 августа 2020

Самый простой способ сделать это - использовать Criteria query, но чтобы использовать его внутри Entity, вам придется ввести туда EntityManager, что считается плохой практикой. Лучшим решением было бы создать этот запрос в Service.

Но если вы все еще хотите это сделать, тогда ваш метод getUsers будет выглядеть примерно так:

public List<User> getUsers() {
    Criteria cr = entityManager.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
    .setResultTransformer(Transformers.aliasToBean(User.class));

    List<User> list = cr.list();
    return list;
}

Если вы хотите ограничить свой список, просто используйте Restrictions, например: criteria.add(Restrictions.eq("id", yourRestrictedId))

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