Hibernate 跨不同包的HQL内部联接

Hibernate 跨不同包的HQL内部联接,hibernate,hql,inner-join,Hibernate,Hql,Inner Join,很可能是因为它们在不同的包中—一个在实体.user中,另一个在实体.associative中。有没有办法更改我的查询 我目前的查询是: 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

很可能是因为它们在不同的包中—一个在
实体.user
中,另一个在
实体.associative
中。有没有办法更改我的查询

我目前的查询是:

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']
tx=session.beginTransaction();
String queryStr=“FROM User u internal JOIN UserGroup ug,其中u.userID=ug.userID和ug.groupID='EORG';
Query=session.createQuery(queryStr);
userList=(ArrayList)query.list();

在查询中,您必须像下面这样显式显示包:

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();
通常,为了防止这种行为,我会这样编写查询:

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

使用getName()您拥有类的完整路径

要加入
用户
用户组
,您需要在
用户
用户组

String myQuery = " FROM " + User.class.getName() + " u, " + 
    UserGroup.class.getName() + " ug 
    where u.userID = ug.userID and ug.groupID = 'EORG'";
从用户u内部加入u.userGroup ug,其中ug.groupID='EORG'

这个查询只是一个例子。它可以用更简单的形式重写

来自用户u,其中u.userGroup.groupID='EORG'


Hibernate的最新版本能够在没有这种关联的情况下使用联接,但它需要在子句上使用

我认为这不是原因。@v.ladynev:是的,另一个原因可能在映射中,但在关联类中没有对象用户,只有userID属性i在尝试显式显示包后收到新错误。java.lang.IllegalStateException:没有左手边的点节点!在没有内部连接的情况下再试一次,但是使用逗号(因为没有明确说明ON子句)啊,这很有效!非常感谢你。我更喜欢您建议的新方法,因为我在sql中使用了它。很抱歉问了一个糟糕的问题!请检查我的回答,因为你是新手。如果答案解决了您的问题,请接受它。您可以仅使用简单属性@JoeTaras(不带onetoone或manytoone属性)将两个实体连接起来,使用上次的Hibernate版本,并使用
打开,就像在我的编辑中一样。不管怎样,这是一个糟糕的做法。从Hibernate 3开始,当然,在我不记得之前。为什么这是一种不好的做法?@JoeTaras您的意思是交叉连接(
User,UserGroup
)还是
internaljoin on
?where子句告诉internaljoin。当我为我编写SQL查询时,逗号是被禁止的,在HQL中显式内部连接很少。例如,您的解决方案可以是write:FROM User,其中u.userGroup.groupID='EORG',因为如果我映射一个oneToOne,则连接是隐式的。