2016-04-07 31 views
0
<hibernate-mapping package="entity.associative"> 
    <class name="UserGroup" table="user_group"> 
    <meta attribute="class-description"> 
    This class contains user group information. 
    </meta> 
    <composite-id> 
     <key-property name="userID" column="u_id"/> 
     <key-property name="groupID" column="g_id"/> 
    </composite-id> 
    <property name="hours" type="double"> 
     <column name="hours"/> 
    </property> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping package="entity.user"> 
    <class name="User" table="user"> 
    <meta attribute="class-description"> 
     This class contains user information. 
    </meta> 
    <id name="userID" type="string"> 
     <column name="u_id" length="50"/> 
    </id> 

    <property name="fName" type="string"> 
     <column name="f_name" length="100"/> 
    </property> 
. 
. 
. 
</hibernate-mapping> 

加入,我發現了錯誤HQL內跨越不同的包

org.hibernate.hql.internal.ast.QuerySyntaxException: 
Path expected for join! 
[FROM entity.user.User u INNER JOIN UserGroup ug 
    where u.userID = ug.userID and ug.groupID = 'EORG'] 

最有可能的,因爲它們是在不同的包 - 一個在entity.user,另一個entity.associative。有沒有辦法改變我的查詢?

我當前的查詢是:

tx = session.beginTransaction(); 
String queryStr = "FROM User u INNER JOIN UserGroup ug where u.userID = ug.userID and ug.groupID = 'EORG'"; 
Query query = session.createQuery(queryStr); 
userList = (ArrayList<User>) query.list(); 
+0

請檢查我的答案 –

+0

因爲你是新手。如果答案完成您的問題,請接受它 –

回答

0

在您查詢,您必須明確包這樣的:

tx = session.beginTransaction(); 
String queryStr = "FROM entity.user.User u, 
    entity.associative.UserGroup ug 
    where u.userID = ug.userID and ug.groupID = 'EORG'"; 
Query query = session.createQuery(queryStr); 
userList = (ArrayList) query.list(); 

平時要防止這種行爲我寫我的查詢是這樣的:

String myQuery = " FROM " + User.class.getName() + " u, " + 
    UserGroup.class.getName() + " ug 
    where u.userID = ug.userID and ug.groupID = 'EORG'"; 

使用getName()你有你的班級的完整路徑

+0

我不認爲這是原因。 –

+0

@ v.ladynev:是的,另一個原因可以在映射中,但在關聯類中沒有對象用戶,但只有userID屬性 –

+0

嘗試顯式包後收到新錯誤。 java.lang.IllegalStateException:沒有左手邊的DOT節點! – klutznic

0

要加入UserUserGroup你必須User的關聯UserGroup

class User { 

    @OneToOne 
    private UserGroup userGroup; 

} 

FROM User u INNER JOIN u.userGroup ug where ug.groupID = 'EORG'

此查詢只是一個例子。它可以在被重寫更簡單地形成

FROM User u where u.userGroup.groupID = 'EORG'

最新版本的Hibernate必須使用沒有這樣的協會加入的能力,但它需要使用on條款。

+0

您可以僅使用簡單屬性(不帶onetoone或manytoone屬性)連接兩個實體 –

+0

@JoeTaras使用最後一個Hibernate版本和'on'作爲我的編輯。無論如何,這是一個不好的做法。 –

+0

從休眠3當然,在我不記得之前。爲什麼是不好的做法? –