Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate(使用Spring)查询多对多_Java_Hibernate_Spring - Fatal编程技术网

Java Hibernate(使用Spring)查询多对多

Java Hibernate(使用Spring)查询多对多,java,hibernate,spring,Java,Hibernate,Spring,我有一个user和一个userRole表,它们具有多对多关系。我有以下Hibernate映射: <hibernate-mapping> <class name="domain.User" schema="dbo" table="Users"> <id name="userId" type="int"> <column name="UserId"/> <generator class="native"/> </id>

我有一个user和一个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>
它将它打印成两倍:

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

我做错了什么?请帮忙:)

你没有做错什么。Hibernate就是这样做的,它与构建查询的方式有关。如果您在SQL中执行相同的操作,那么还将有两行

解决此问题的一般方法有两种:

  • 您可以使用
    DistinctRootEntityProjection
    ,但据我所知,这只适用于条件
  • 您可以自己过滤掉重复项(我建议您将该逻辑封装在调用hibernate的类中)。最简单的方法就是把你的物品放在一组,然后再拿出来

我找到了一个符合以下标准的解决方案:

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();

}
public List getWithUsername(字符串用户名){
Criteria=getSession().createCriteria(IWUser.class)
.add(限制。例如(“用户名”,用户名))
.setFetchMode(“用户角色”,FetchMode.EAGER)
.setResultTransformer(标准.DISTINCT\u ROOT\u实体);
返回条件。list();
}

谢谢您的回答。您是否有一个代码示例来演示如何使用DistincTrotentyProjection执行此操作?
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
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();

}