2013-03-15 6 views
0

У меня есть огромные трудности для достижения чего-то, что я думаю, должно быть довольно легко.Критерии API. Сортировать по последнему ребенку

В основном у меня есть OrderBean и OrderInsertBean. Они оба отображаются объекты в таблицу mySQL. OrderBean может иметь несколько OrderInsertBeans, а OrderInsertBean имеет только один OrderBean.

Im writing Hibernate Criteria запрашивает построение динамического запроса, который будет искать и сортировать результаты из этих таблиц. В основном он работает нормально, за исключением случаев, когда я пытаюсь сортировать заказы на следующий OrderInsertBean.

Вы видите, что у OrderInsertBean есть insertDate, и для каждого ордера я хочу выбрать первый OrderInsert, который имеет insertDate больше, чем сегодня, и сортировать заказы к этой дате.

Простой в простом SQL. Может быть записано несколько способов, но это один из способов сделать это:

select o.*, (select min(oi2.insertDate) 
from AIDA_ORDER_INSERT oi2 where oi2.insertDate > curdate() 
and oi2.orderId = o.orderId) as insertDateNew 
from AIDA_ORDER o 
order by insertDateNew 

Но как * это может быть записано как критерии запроса Hibernate? Или запрос на получение запроса JPA 2 также хорош.

Это, насколько я получил ...

Criteria crit = session.createCriteria(OrderBean.class, "order"); 
DetachedCriteria subquery = DetachedCriteria.forClass(OrderInsertBean.class, "oi"); 
subquery.add(Restrictions.ge("oi.insertDate", new Date())); 

ProjectionList projectionList = Projections.projectionList(); 
projectionList.add(Projections.min("oi.insertDate")); 
projectionList.add(Projections.groupProperty("oi.orderId")); 
subquery.setProjection(projectionList); 

// How to add the subquery to the main query to get the desired results?? 

// Finally ordering the results: 
crit.addOrder(Order.asc("insertDateNew")); 

Я думаю, что мне нужно, чтобы каким-то образом добавить подзапрос критериям списка выбора, дать ему псевдоним, а затем упорядочить по нему .. .

Но я застрял и не знаю, куда идти. Может ли кто-нибудь помочь бедному человеку?

Благодаря

ответ

0

Вы пробовали добавление Order к критериям?

Как:

crit.addOrder(Order.asc("insertDateNew")); 
+0

Ну, дух ... Да. Этот addOrder не является проблемой здесь. Это я под контролем. Трудная вещь заключается в том, как я могу добавить подзапрос в основной запрос, чтобы получить результаты, определенные выше. В настоящее время мой код не работает вообще. – user829237

+0

addOrder не был в вашем вопросе, когда я прокомментировал это, казалось, был очевидным ответом (для меня). – evandongen

0

Вы уже отображенные ассоциации между Орденом и OrderInsert. Не работает ли это?

Criteria crit = session.createCriteria(OrderBean.class, "order"); 

crit.createAlias("orderInserts", "oi"); 

crit.add(Restrictions.ge("oi.insertDate", new Date())); 

ProjectionList projectionList = Projections.projectionList(); 
projectionList.add(Projections.min("oi.insertDate")); 
projectionList.add(Projections.groupProperty("oi.orderId")); 
crit.setProjection(projectionList); 

// Finally ordering the results: 
crit.addOrder(Order.asc("oi.insertDateNew")); 
Смежные вопросы