Java Hibernate(使用Spring)查询多对多
我有一个user和一个userRole表,它们具有多对多关系。我有以下Hibernate映射: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>
<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();
}