如何通过从JDOQL到HQL的多个表的连接来端口查询

Aar*_*ron 1 java port hibernate hql

我正在将一个KodoJDO应用程序移植到Hibernate.我有一个查询,遍历db中的4个表,以及java代码中的3个对象.

在英语中,查询是查找在系统X中具有权利的用户.

我在用户对象上调用的JDOQL where子句是entitlements.contains(ent)&&(upper(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'
Run Code Online (Sandbox Code Playgroud)

我对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']
Run Code Online (Sandbox Code Playgroud)

db的结构如下:

 User
   id

 UserEntitlement
   userid
   entitlementid

 Entitlement
   id
   systemid

 System
   id
Run Code Online (Sandbox Code Playgroud)

java代码结构如下:

 class User 
 {
    String id;
    Set<Entitlement> entitlements;
 }

 class Entitlement
 {
    String id;
    System system;
 }

 class System
 {
    String id;
 }
Run Code Online (Sandbox Code Playgroud)

更新我的最终查询

            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";
Run Code Online (Sandbox Code Playgroud)

是的我知道我应该使用参数,但是我有很多问题要解决,并且会将该代码发布到另一天.

具有隐式内部联接的另一种变体,用于授予系统权利

        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";
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

你应该使用连接:

select distinct u.id from User u
inner join u.entitlements as entitlement
inner join entitlement.system as system
where system.id = :evpn
Run Code Online (Sandbox Code Playgroud)

其中:evpn是您必须绑定的命名参数.

在执行HQL时,您必须考虑对象之间的对象和关系,而不是在表,外键和连接表方面.