Hibernate
От: lexius www.acula.org
Дата: 14.02.06 17:23
Оценка:
Подскажите как в хибернейте правильно оформить запрос:
Нужно получить все объекты, в которых поле Set<Role> либо не задано (пусто) либо находится в диапазоне значений.

.add(Restrictions.or(Restrictions.in("roles.name", userroles), Restrictions.isEmpty("roles"))


не катит, так как не находит "roles.name". Еси использую subcriteria то не знаю как это соединить вместе.
************
www.acula.org
Re: Hibernate
От: lexius www.acula.org
Дата: 15.02.06 06:44
Оценка:
а теперь подробнее:

Нужна помощь с запросом в 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
создано как нтого требуется)
Народ, кому не впадло было это прочитать и кто разбирается — подскажите куда копать.
************
www.acula.org
Re: Hibernate
От: Temperature  
Дата: 15.02.06 09:10
Оценка:
Здравствуйте, 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();
Re[2]: Hibernate
От: Денис Цыплаков Россия  
Дата: 15.02.06 09:17
Оценка:
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
Re[3]: Hibernate
От: Temperature  
Дата: 15.02.06 09:24
Оценка:
Здравствуйте, Денис Цыплаков, Вы писали:

ДЦ>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 */
ДЦ> Знающий не говорит, говорящий не знает
Re: Hibernate
От: Ivan Bodrov  
Дата: 15.02.06 11:36
Оценка:
Здравствуйте, 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));
Re[2]: Hibernate
От: lexius www.acula.org
Дата: 15.02.06 20:53
Оценка:
IB>i.e.
IB>
IB>Criteria c = session.createCriteria(User.class).createAlias("roles", "r").add(Expression.in("r.name", userroles));
IB>


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