HQL Inner Join 跨不同的包

HQL Inner Join across different packages

<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>

我遇到错误

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

在您的查询中,您必须像这样显式打包:

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() 您可以获得 class

的完整路径

要加入 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 子句。