Hibernate (с использованием Spring) запрос с многими ко многим - PullRequest
0 голосов
/ 08 июля 2011

У меня есть пользователь и таблица userRole с отношением «многие ко многим». У меня есть следующее отображение Hibernate:

<hibernate-mapping>
<class name="domain.User" schema="dbo" table="Users">
<id name="userId" type="int">
  <column name="UserId"/>
  <generator class="native"/>
</id>
<property name="username" type="string">
  <column name="Username" not-null="true"/>
</property>
<property name="password" type="string">
  <column name="Password" not-null="true"/>
</property>
<set cascade="all" inverse="true" name="userRole" table="UserRoleRelationships">
  <key>
    <column name="UserId"/>
  </key>
  <many-to-many class="domain.UserRole" column="RoleId" />
</set>
</class>
</hibernate-mapping>

и

<hibernate-mapping>
<class name="domain.UserRole" schema="dbo" table="UserRoles">
<id name="roleId" type="int">
  <column name="RoleId"/>
  <generator class="native"/>
</id>
<property name="role" type="string">
  <column name="Role" not-null="true"/>
</property>
</class>
</hibernate-mapping>

Мои бобы выглядят так:

public class User {

private Integer userId;
private String username;
private String password;
private Set<UserRole> userRole;

// getters and setters
}

public class UserRole {

private Integer roleId;
private String role;
private User user;

// getters and setters
}

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

public List<User> getWithUsername(String username){
    return getHibernateTemplate().find("from User as u "
            + "inner join fetch u.userRole "
            + "where u.username = '" + username + "'" );
}

Проблема в том, что когда я пытаюсь распечатать это с помощью следующих циклов:

for (User u : list){
            System.out.println(u.getUsername());

            for (UserRole ur : u.getUserRole()){
                System.out.println(ur.getRole());
            }  
        }

Он печатает его вдвое:

Username: jorgen
User role: User
User role: Admin
Username: jorgen
User role: User
User role: Admin

Что я делаю не так? Пожалуйста, помогите:)

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Я нашел решение, которое делает это по критериям:

public List<User> getWithUsername(String username){

    Criteria criteria = getSession().createCriteria(IWUser.class)
    .add(Restrictions.like("username", username))
    .setFetchMode("userRole", FetchMode.EAGER)
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    return criteria.list();

}
0 голосов
/ 08 июля 2011

Вы не делаете ничего плохого. Hibernate просто делает это, и это связано с тем, как он создает запросы. Если вы сделаете то же самое в SQL, у вас также будет две строки.

Существует два основных способа решения этой проблемы:

  • Вы можете использовать DistinctRootEntityProjection, но, насколько мне известно, это работает только с критериями
  • Вы можете отфильтровать дубликаты самостоятельно (я предлагаю вам инкапсулировать эту логику в классе, вызывающем ваш спящий режим). Самый простой способ - просто бросить свои вещи в набор и достать их снова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...