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
的完整路径
要加入 User
和 UserGroup
,您需要在 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
子句。
<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
的完整路径要加入 User
和 UserGroup
,您需要在 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
子句。