2016-11-08 4 views
0

У меня есть стол с колонками id, seq_id, tran_date.Запрос MySQL на Hibernate Criteria

Образец данных:

 
id  | seq_id | tran_date 
------ | ------ -------- 
1  | 1  | 2016-11-01 
1  | 2  | 2016-11-01 
1  | 1  | 2016-11-02 
1  | 2  | 2016-11-02 
1  | 1  | 2016-11-12 
1  | 2  | 2016-11-12 

мой ожидаемый результат

 
1  | 2  | 2016-11-02 

Состояние:

tran_date должно быть меньше, чем сегодня (2016-11-08) и макс (seq_id).

Как реализовать запрос на спящий режим, используя критерии api, указанные выше?

в режиме реального времени MySQL запросов, используя теперь, как показано ниже, нужно преобразовать то же самое в Hibernate Criteria:

SELECT * 
    FROM testtable tt 
    WHERE CONCAT(DATE_FORMAT(tt.tran_date, '%Y%m%d'), LPAD(tt.seq_id , 2, '0')) = 
    (SELECT MAX(CONCAT(DATE_FORMAT(mtv1.tran_date, '%Y%m%d'), LPAD(mtv1.seq_id , 2, '0'))) 
    FROM testtable tt1 WHERE tt1.`Label_Id` = tt1.`id` 
    AND mtv1.tran_date<= CURRENT_DATE() GROUP BY mtv.`id`) 
+0

Существует две колонки с max (seq_id). Кого вы хотите получить? С max tran_date? –

+0

Хорошо, что я понял ваш sql и увидел таблицу –

ответ

0

Вы можете сделать эквивалент вашего запроса с Hibernate Criteria.

public YourClassName getResult() throws ParseException { 
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2016-11-08"); 
    Criteria criteria = session.createCriteria(YourClassName.class); 
    criteria.add(Restrictions.lt("tran_date", date)); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.max("id"), "id"); 
    projectionList.add(Projections.max("seq_id"), "seq_id"); 
    projectionList.add(Projections.max("tran_date"), "tran_date"); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(new AliasToBeanResultTransformer(YourClassName.class)); 
    if (criteria.list().isEmpty()) { 
     return null; 
    } else { 
     YourClassName yourClassName = (YourClassName) criteria.list().get(0); 
     return yourClassName; 
    } 
} 
+0

, имеет несколько столбцов. Если я применяю группу по id на таблице, я должен получить записи max (trans_date, sequence). Там, где выше, будет извлекаться 3 записи максимальных значений. В вышеупомянутом SQL-запросе я упомянул *, указывающий все столбцы на основе трех условий: 1) max (trans_date, sequence) 2) trans_date <= current_date(). 3) группа по id. –

+0

Все записи id - 1? –

+0

Это зависит от примера:

 id | seq_id | tran_date ------ | ------ -------- 1 | 1 | 2016-11-02 1 | 2 | 2016-11-02 1 | 1 | 2016-11-12 1 | 2 | 2016-11-12 2 | 1 | 2016-11-01 2 | 2 | 2016-11-01 2 | 1 | 2016-11-02 2 | 2 | 2016-11-02 3 | 1 | 2016-11-12 3 | 2 | 2016-11-12
Надеюсь, теперь вы поймете –