2016-04-07 32 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当然,在我不记得之前。为什么是不好的做法? –