Как перенести запрос с объединением нескольких таблиц из JDOQL в HQL - PullRequest
1 голос
/ 29 января 2011

Я портирую приложение для KodoJDO в Hibernate. У меня есть запрос, который проходит через 4 таблицы в БД и 3 объекта в коде Java.

На английском языке запрос «Найти пользователей, имеющих права в системе X».

мой JDOQL, где предложение, вызываемое для объекта User, было где authorlements.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";

1 Ответ

6 голосов
/ 29 января 2011

Вы должны использовать соединения:

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и не с точки зрения таблиц, внешних ключей и таблиц соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...