如何将跨多个表的联接查询从 JDOQL 移植到 HQL

发布于 2024-10-15 01:28:15 字数 1792 浏览 2 评论 0原文

我正在将 KodoJDO 的应用程序移植到 Hibernate。 我有一个查询跨越数据库中的 4 个表和 java 代码中的 3 个对象。

在英语中,查询是 Find the users that have entitlements in system X.

我的 JDOQL where 子句在 User 对象上调用是 其中 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'

我对 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
   id

java 代码的结构如下:

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

I am porting an application for KodoJDO to Hibernate.
I have a query that goes across 4 tables in the db, and 3 objects in the java code.

In English the query is Find the users that have entitlements in system X.

my JDOQL where clause called on the User object was
where entitlements.contains(ent) && (upper( ent.system.id ) = 'EVPN')

some sql that does the query is:

 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'

My best guess for HQL gives me an exception

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

the db is structured like this:

 User
   id

 UserEntitlement
   userid
   entitlementid

 Entitlement
   id
   systemid

 System
   id

the java code is structured as below:

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

 class Entitlement
 {
    String id;
    System system;
 }

 class System
 {
    String id;
 }

Update My final query that works

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

Yes I know I should use parameters, but I have a great many problems to solve, and will post pone that code for another day.

Another variation with an implicit inner join for entitlement to system

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心病无药医 2024-10-22 01:28:15

您应该使用 joins :

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 时必须考虑对象和对象之间的关系,而不是表、外键和连接表。

You should use joins :

select distinct u.id from User u
inner join u.entitlements as entitlement
inner join entitlement.system as system
where system.id = :evpn

where :evpn is a named parameter that you have to bind.

You must think in terms of objects and relationships between objects when doing HQL, and not in terms of tables, foreign keys and join tables.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文