Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, LaPerouse, Вы писали:
LP>>Оказывают, если уметь пользоваться их возможностями. Не имея опыта использования современной ORM (в .net этому опыту взяться неоткуда), весьма неосмотрительно делать такие выводы.
S>Убедительные примеры будут?
Спрашивай.
LP>>Закат солнца вручную будет у тебя, когда ты будешь вручную разруливать идентити объектов, перекладываю их руками из таблицы.
S>Чегось?
LP>>ОРМ не делает никакой магии — просто избавляет программиста от рутины написания тысячного по счету однотипного кода перекладывания данных из реляционной модели в объектно-ориентированную.
S>Эмм, я пока знаю только одну такую "ORM". Это — linq2sql. Он ровно перекладывает данные. Есть кто-то ещё, без change tracking и lazy load?
Hibernate, eclipselink — две самые распространенные java-orm, при желании там можно этого добиться, только зачем?
LP>>Как решается эта проблема в plain-sql? Пишется запрос. Как решается эта же проблема в orm? Сюрприз — пишется запрос. Просто во втором случае у нас объектно-ориентированный язык запросов с готовым графом объектов на выходе, без необходимости организовывать тысячный по счету закат солнца руками.
S>Убедительные примеры будут?
S>Покажите, во что на "объектно-ориентированном языке запросов" у нас переписывается plain sql:
S>S>select c.Id, c.CityName, sum(o.TotalAmount) as totalSales from
S> city c inner join customers cs on cs.cityId = c.Id
S> inner join orders o on o.customerId = cs.Id
S> where o.status = 'SHIPPED'
S> group by c.ID, c.RegionID, c.CityName
S> having c.RegionID = @RegionID
S>
На объектно-ориентированном языке запросов JPQL это делается элементарно, красиво, и лаконично, и без всяких убогих cs.cityId=c.Id
(эта информация сидит в описании класса и реализации jpa берет ее оттуда, как и любое другое описание):
select city.id, city.name, sum(o.totalAmount)
from Order o
join o.customer customer
join customer.city city
where o.status='SHIPPED'
group by city.id, city.regionId, city.name
having city.regionId=:regionId
S>И какого типа будет возвращаемое значение.
Какого хочешь. Проще всего так:
List<Object[]> result = em.createQuery(query, Object[].class).getResultList();
Но можно подсунуть любой класс или хештаблицу.
Социализм — это власть трудящихся и централизованная плановая экономика.