2012-09-03 59 views
2

我想使用Hibernate來訪問我們的權限管理持久數據,但我很新,並努力獲得我需要的數據。休眠加入使用條件

我有用戶表,ID和名稱,一個組ID表和一個ID和名稱,以及一個用戶/組映射,它只是由鏈接的組ID和用戶ID組成。

我想要做的就是給定組的成員的所有名字,所以標準的SQL查詢我要執行的是:

SELECT 
    u.NAME 
FROM 
    USERS u 
JOIN 
    GROUP_USERS gu 
ON 
    u.ID = gu.USER_ID 
JOIN 
    GROUPS g 
ON 
    gu.GROUP_ID = g.ID 
WHERE 
    g.NAME = 'test' 

但儘管尋找和播放我不能小時似乎得到任何地方。

我想使用標準,因爲他們看起來更清晰,所以我的代碼如下:

@Override 
public final List<String> getGroupMembers(final String groupName) { 
    @SuppressWarnings("unchecked") 
    List<User> groupUsers = getHibernateTemplate().execute(new HibernateCallback<List<User>>() { 

       @Override 
       public List<User> doInHibernate(Session session) throws HibernateException, SQLException { 
        Criteria criteria = session.createCriteria(User.class) 
         .setFetchMode("GroupUsers", FetchMode.JOIN) 
         .setFetchMode("Group", FetchMode.JOIN) 
         .add(Restrictions.eq("name", groupName)); 
        return criteria.list(); 
       } 
      }); 

    List<String> groupUsernames = new ArrayList<String>(); 
    for (User groupUser : groupUsers) { 
     groupUsernames.add(groupUser.getName()); 
    } 
    return groupUsernames; 
} 

但是當我測試的結果集是空的,並根據日誌所執行的查詢是這樣的:

select this_.ID as M1_4_0_, this_.NAME as M2_4_0_ from USERS this_ where this_.NAME=? 

我讓Hibernate創建使用hibernate.hbm2ddl.auto表,但後來刪除了,這樣的表肯定是Hibernate所期待,但數據沒有被清理。

任何與標準的幫助將不勝感激,所以提前致謝!

編輯:我使用的XML映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="com.company"> 
    <class name="com.company.Group" table="GROUPS"> 
     <id name="id" column="ID" type="int"> 
      <generator class="identity"/> 
     </id> 
     <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/> 
    </class> 
</hibernate-mapping> 

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="com.company"> 
    <class name="com.company.GroupUsers" table="GROUP_USERS"> 
     <composite-id> 
      <key-many-to-one name="groupId" class = "Group" column="GROUP_ID" /> 
      <key-many-to-one name="userId" class = "User" column="USER_ID" /> 
     </composite-id> 
    </class> 
</hibernate-mapping> 

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="com.company"> 
    <class name="com.company.User" table="USERS"> 
     <id name="id" column="ID" type="int"> 
      <generator class="identity"/> 
     </id> 
     <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/> 
    </class> 
</hibernate-mapping> 
+0

你申請用戶實體上的過濾器「名稱」。你可以發佈你的映射來看看你是如何描述與Hibernate註釋的關係的? – kothvandir

+0

感謝您的回覆 - 我已經添加了映射文件。我將如何設置檢索用戶名,但過濾組名呢? – TheBloodGuy

回答

4

您不需要映射用戶組表,只需將用戶和組之間的關係定義爲多對多關係,請參閱thisthis,瞭解如何映射多對多關係。

在你的情況下,它看起來像:

<hibernate-mapping package="com.company"> 
    <class name="com.company.User" table="USERS"> 

    <id name="id" column="ID" type="int"> 
     <generator class="identity"/> 
    </id> 
    <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/> 

<many-to-many name="userGroups" 
    target-entity="com.company.Group"> 
    <join-table name="YOUR_USER_GROUP_TABLE"> 
    <join-column name="USER_ID" /> 
    <inverse-join-column name="GROUP_ID" /> 
    </join-table> 
</many-to-many> 

</class> 

,並使用來自例如集團實體名稱字段來過濾用戶:

Criteria criteria = session.createCriteria(User.class); 
criteria.createAlias("userGroups", "usrGrp",CriteriaSpecification.LEFT_JOIN); 
criteria.add(Restrictions.eqProperty("usrGrp.name", "test")) 
0

您的對象映射到表的方法不能從使用中獲益的Hibernate作爲ORM。考慮一個更加面向對象的模型,例如:

class Group { 
    private Set<User> users; 
    // ... 
} 

class User { 
    private Set<Group> groups; 
    //.. 
} 

所以,你有一個經典的多對多關聯。 Here你可以在Hibernate中找到這樣的映射的例子。