[Hibernate] можно ли написать такой запрос на HQL?
вот вам объектно-ориентированный язык запросов
Что мешает в классе, объекты которого у тебя хранятся в T2, сделать Collection из объектов T1, задав правильный foreign key в соотв *.hbm.xml файле?
В этом случае ты выбираешь просто все объекты из T2, какие нужны, а потом уже объектно-ориентированно бродишь по объектам из T1. И хибернейт _сама_ подгрузит нужный Collection из БД без всяких телодвижений с твоей стороны.
А если тебе вынь да положь именно джойн - не поленился бы залезть в гугл и тогда первой же ссылкой ты бы прочитал.
Удачи! =)
самый тупой:
from T1 as t1 left outer join t1.t2 as t2
where t2.b = 'test'
Это разные запросы. Иди ботай join.
иди ботай HQL.
Да при чем тут HQL? Написав where ты полностью потеряешь случаи, где t2.b != 'test', а исходный запрос подразумевает, что они останутся, просто будут иметь на месте t2.b null. Или действительно я туплю? Просто нет сейчас под рукой SQL-ной консоли...
а если t2.b = 'test' поставить в where , то это условие будет провряться уже на результате join'а и никаких null'ов не получится
select T1.* from T1 left outer join T2 on T1.a = T2.a and T2.b = 'test'
Хмм, T1.*... А что тогда вообще дает этот "and T2.b = 'test'"?
кстати да, нах там там вторая таблица с outer join'ом - непонятно
а исходный запрос подразумевает, что они останутся,Неа, в исходном тоже не пойми что. Смысл исходного запроса я не понимаю, но тут уж "каков вопрос"...
выдать записи из т1, у которых атрибут а равен атрибуту а записей из т2 с полем b равным 'test'
... where t2.b = 'test' or t2.b is null
но в t2 могут быть свои null-ы изначально...
поскольку для некоторых записей t2 = null, то условие t2.b = 'test' для них выполняться не будет, соответственно любые пустые записи из левого джойна будут отфильтрованы, тогда зачем outer join?
Хмм, T1.*... А что тогда вообще дает этот "and T2.b = 'test'"?вот более осмысленный пример
select T1.*from T1 left outer join T2 on T1.a = T2.a and T2.b = 'test'
order by T2.c
code:-------------------------------------------------------------------------------- ... where t2.b = 'test' or t2.b is null --------------------------------------------------------------------------------даже если в T2 нет своих налов все равно это не тоже самое, могу привести пример на конкретных данных
но в t2 могут быть свои null-ы изначально...
Приводи. А то я часто в join-ах путаюсь, будем образовываться
join on ... and T1.b = 'test'
Ладно, тогда будем дальше думать...
Вот как в первом посте
Так вот и непонятно в чем смысл первого пример, он всегда возвращает select * from T1, или нет?Повторы в T2.a что ли могут сказываться?
Выдать все виды вклада, отсортированные по процентной ставке годовых (срок = 12). Причем у некоторых вкладов нет срока равного 12 месяцев.
Как это выразить на HibernateQL, я не нашел, потому что там нельзя
1. писать в join-е on
2. делать outer join с результатом запроса (подзапроса)
он всегда возвращает select * from T1это был не полный пример, в реальных примерах на поля таблицы T2 можно накладывать условия или сортировать по ним
Повторы в T2.a что ли могут сказываться?в общем случае да
но мне казалось, что сам хибернейт был придуман для того, чтобы этих джойнов избежать.Hibernate был придуман фанатами Java, которые не понимают красоту реляционной теории. Зачем они это сделали известно только им.
Причем у некоторых вкладов нет срока равного 12 месяцев.То есть у них тогда процентная ставка будет null, так и надо? Составь просто union и не парься, отдельно те, где есть 12 месяцев, отдельно где нет. Для вторых еще по идее не плохо бы процентную ставку саппроксимировать...
Как это выразить на HibernateQL, я не нашел, потому что там нельзяПотому что в Hibernate нет join-ов. Ключевое слово join в HQL придумано для удобства. То, что ты написал, удобнее делать через коллекции и фильтры, а может быть через критерии.
1. писать в join-е on
2. делать outer join с результатом запроса (подзапроса)
у кого нибудь есть дистрибутив NHibernate для дотнета ? расшарьте пожалуйста...
блин! до чего же ббкоды кривые! никакими способами не смог сделать линк на ресурс, когда в пути был пробел =\
То есть у них тогда процентная ставка будет null, так и надо?да
Составь просто union и не парься, отдельно те, где есть 12 месяцев, отдельно где нет.в HQL есть union? я не нашел.
просто unionпопробуй запиши запрос с union. Читабильность такого запроса явно будет хуже. Выполняться он будет значительно медленнее.
Hibernate для дотнета, нафиг не нужен. Там есть простые и мощные DataSet-ы.
сложные и дохлые
Может на HQL написать такое и нельзя, но
1. Есть subselect - пишешь для класса произвольный SQL запрос. Не уверен, правда, что там джойны можно писать, не проверял. Зато там можно вставлять различные count итд.
2. Есть Criteria Queries. С помощью них почти наверняка можно выразить то, что ты хочешь.
Пример из мануала.
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list;
ЗЫ Это все взято из доки по Hibernate 3.0
С помощью них почти наверняка можно выразить то, что ты хочешь.вообще, тред начался с вопроса как это сделать? Вопрос был сформулирован четко. Напиши запрос, а не строй предположения.
ЗЫ Возможно попозжее и напишу.
ЗЗЫ. С subselect например делаешь так
<class name="">
<subselect>
твой SQL запрос из первого поста
</subselect>
...
</class>
Правда, эта ерундень будет рид-онли.
зато, если кому надо будет, он будет знать куда копатьтипа надо документацию Hibernate-а посмотреть?
на HQL!
Типа меня ломает. В критериях есть сортировка по произвольному елементу. Ставишь ее.
Думаю там где нуллы оно само учтет.
По второму вопросу - я в своем некрофильском посте сказал - что на HQL такое нельзя.
ЗЫ Хибернейт вообще, как я понимаю, от HQL уходить пытается. Поэтому рассматривать его как удобное самодостаточное средство для получения всего и вся я бы не стал =)
HQL уходить пытаетсянапиши плиз ссылку где об этом пишут.
Поэтому рассматривать его как удобное самодостаточное средство для получения всего и вся я бы не стала чем они его заменить хотят?
в документации о HQL больше всего написано, чем о других способах выборки
Оставить комментарий
6yrop
Можно ли на HQL аналог вот такого SQL-ного запроса?