Подскажите как в хибернейте правильно оформить запрос:
Нужно получить все объекты, в которых поле Set<Role> либо не задано (пусто) либо находится в диапазоне значений.
.add(Restrictions.or(Restrictions.in("roles.name", userroles), Restrictions.isEmpty("roles"))
не катит, так как не находит "roles.name". Еси использую subcriteria то не знаю как это соединить вместе.
а теперь подробнее:
Нужна помощь с запросом в Hibernate
Столкнулся с такой проблемой:не могу правильно оформить запрос. Есть объект Catalog, который может хранить коллекцию ролей Set<Roles> userroles
так вот нужно выбрать все каталоги у которых либо нет ролей, либо роли нахосовпадают с другой коллекцией ролей.Как это сделать по отдельности я знаю. Для формирования сложных запросов я использую Criteria.
Для того, чтобы выбрать каталоги с пустыми ролями я делал примерно следующее (могу опечататься т.к. пишу по памяти).
cr.CreateCriteria(Catalog.class)
Restrictions.isEmpty("roles")
Для того, чтобы выбрать каталоги с ролями, совпадающими с диапазоном ролей я предварительно формировал коллекцию с именами ролей Set<String> names, с которыми должно быть совпадение, потом:
использовал субкритерию
.CreateCriteria("roles")
.add(Restrictions.in("name", names))
А как это совместить — не знаю. Как указать, что нужно либо то — либо другое.Пытался замутить нечто вроди:
...
.add( Restrictions.or( Restrictions.isEmpty("roles"), Restrictions.in("roles.name", names) ) )
...
так вот такое не проходит. Вся проблема в "roles.name" — пишет что не находит такого поля, то есть хибернейт не понимает, что нужно в коллекции объектов Roles проверять поле name.
Пробовал вариант:
Restrictions.or( Restrictions.isEmpty("roles"), Restrictions.in("roles", userroles) )
но тоже не получилось, видимо хибернейт не может такое делать.(в классе Roles и HashCode и isEquals и toString
создано как нтого требуется)
Народ, кому не впадло было это прочитать и кто разбирается — подскажите куда копать.
Здравствуйте, lexius, Вы писали:
L>Подскажите как в хибернейте правильно оформить запрос:
L>Нужно получить все объекты, в которых поле Set<Role> либо не задано (пусто) либо находится в диапазоне значений.
L>L>.add(Restrictions.or(Restrictions.in("roles.name", userroles), Restrictions.isEmpty("roles"))
L>
L>не катит, так как не находит "roles.name". Еси использую subcriteria то не знаю как это соединить вместе.
а может так?
Query query = session.createQuery("Instance as instance where instance.state in (:stateNames)" );
String[] statuses = {q1, q2, q3};
query.setParameterList("stateNames", statuses, String);
return query.list();
Temperature пишет:
> а может так?
>
> Query query = session.createQuery("Instance as instance where
> instance.state in (:stateNames)" );
> String[] statuses = {q1, q2, q3};
> query.setParameterList("stateNames", statuses, String);
>
> return query.list();
Наверное добавить or instance.state is empty
Я такие вещи тоже HQL-ем делаю
--
WBR Денис Цыплаков /* jabber UID: denis.tsyplakov@jabber.ru */
Знающий не говорит, говорящий не знает
Posted via RSDN NNTP Server 2.0
Здравствуйте, Денис Цыплаков, Вы писали:
ДЦ>Temperature пишет:
>> а может так?
>>
>> Query query = session.createQuery("Instance as instance where
>> instance.state in (:stateNames)" );
>> String[] statuses = {q1, q2, q3};
>> query.setParameterList("stateNames", statuses, String);
>>
>> return query.list();
ДЦ> Наверное добавить or instance.state is empty
Ну я же чисто как пример... с or-ом проблем не должно было возникнуть
ДЦ> Я такие вещи тоже HQL-ем делаю
ДЦ>--
ДЦ>WBR Денис Цыплаков /* jabber UID: denis.tsyplakov@jabber.ru */
ДЦ> Знающий не говорит, говорящий не знает
Здравствуйте, lexius, Вы писали:
L>L>.add(Restrictions.or(Restrictions.in("roles.name", userroles), Restrictions.isEmpty("roles"))
L>
L>не катит, так как не находит "roles.name". Еси использую subcriteria то не знаю как это соединить вместе.
Criteria.createAlias поможет.
i.e.
Criteria c = session.createCriteria(User.class).createAlias("roles", "r").add(Expression.in("r.name", userroles));
IB>i.e.
IB>IB>Criteria c = session.createCriteria(User.class).createAlias("roles", "r").add(Expression.in("r.name", userroles));
IB>
Фиг его знает чего оно так не работает

По отдельности — все пашет, вместе — нет. Пришлось немного структуру приложения поменять из-за этой фигни. Как говорится, обошол проблему через одно место.