我正在将KodoJDO的应用程序移植到Hibernate。我有一个查询,它跨越数据库中的4个表,以及java代码中的3个对象。
在英文中,查询是查找系统X中有应享权利的用户。
我在User对象上调用的JDOQL子句位于entitlements.contains(ent) &( ent.system.id )=‘EVPN’的位置。
执行查询的一些sql是:
select unique(u.id)
from USER u, USERENTITLEMENT ue, ENTITLEMENT e, SYSTEM s
where u.id = ue.userid
and ue.entitlementid = e.id
and e.systemid = s.id
and s.id = 'evpn'我对HQL的最佳猜测给了我一个例外
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: ( [select user from com.ebig.entity.User as user, com.ebig.entity.Entitlement as ent, com.ebig.entity.System as sys where entitlements.contains(ent) and ent.system = sys and sys.id = 'evpn']数据库的结构如下:
User
id
UserEntitlement
userid
entitlementid
Entitlement
id
systemid
System
idjava代码的结构如下:
class User
{
String id;
Set<Entitlement> entitlements;
}
class Entitlement
{
String id;
System system;
}
class System
{
String id;
}更新我的最后一个查询
hqlQuery = "select distinct user from User as user "+
"inner join user.entitlements as entitlement inner join entitlement.system as system "+
"where system.id = 'evpn' AND mod(user.flags, 2) = 0 AND source = 1";是的,我知道我应该使用参数,但我有很多问题要解决,并将在以后的一天内发布这段代码。
另一种对系统权利的内隐连接的变体
hqlQuery = "select distinct user from User as user "+
"inner join user.entitlements as entitlement "+
"where entitlement.system.id = 'evpn' AND mod(user.flags, 2) = 0 AND source = 1";发布于 2011-01-29 12:17:49
您应该使用联接:
select distinct u.id from User u
inner join u.entitlements as entitlement
inner join entitlement.system as system
where system.id = :evpn其中:evpn是必须绑定的命名参数。
在执行HQL时,必须考虑对象和对象之间的关系,而不是表、外键和联接表。
https://stackoverflow.com/questions/4836599
复制相似问题