Я портирую приложение для 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";