Другая опция (с очень гибкой лицензией) состоит в том, чтобы портировать алгоритм от VTK:
Этот алгоритм работает довольно хорошо. Используя его непосредственно возможно, но требует ссылок на VTK, который может иметь больше служебное, чем Вы хотите (хотя это имеет много других хороших функций, также).
Это поддерживает ограничения (дыры/границы/и т.д.), а также триангулирование поверхности, которая находится не обязательно в плоскости XY. Это также поддерживает некоторые функции, которые я не видел в другом месте (см. примечания по значениям Alpha).
Правильный синтаксис JPQL с использованием подзапроса:
SELECT p FROM ProcessUser p
WHERE p.id NOT IN (
SELECT p2.id FROM ProcessUser p2
JOIN p2.roles role
WHERE role.name='sysadmin'
)
Будет ли это работать для вас?
SELECT *
FROM ProcessUser
WHERE Exists
(
SELECT 1
FROM
ProcessUserRoles
INNER JOIN Roles
ON Roles.RoleId = ProcessUserRoles.RoleId
WHERE 1=1
AND ProcessUser.ProcessUserId = ProcessUserRoles.ProcessUserId
AND Roles.RoleDescription = 'Super User'
)
Ваш запрос в основном возвращает список пользователей / ролей, так как у вашего пользователя две роли, он возвращается дважды, вы отфильтровываете одну строку, исключая роль 'sysadmin'. Похоже, вы хотите исключить всех пользователей, имеющих роль «системного администратора», независимо от того, есть ли у них другие роли. Вам нужно будет добавить что-то к вашему запросу, например. (Я исхожу по вашему запросу, а не по вашему описанию)
where processuse0_.id not in
select ( userId from
ProcessUserRoles
inner join
Role
on ProcessUserRoles.roleId=Role.id
where role.name != 'sysadmin'
)
Выполнить вложенный запрос. Сначала выберите всех пользователей с ролью системного администратора. Затем выберите дополнение к этому результату или всех пользователей, которых нет в этом результате.