Создайте критерии гибернации, чтобы показать результат как этот запрос - PullRequest
0 голосов
/ 23 мая 2018

Привет Пожалуйста, под таблицей и запросом.Это взято из чужого поста, но это именно так, как мне было нужно.Я хочу создать Hibernate Criteria (без HQL или SQL), который выдает тот же результат, что и sql ниже этой таблицы.

Есть идеи, как это сделать?

Вот я пытался, но это не правильнопуть.

criteria.setProjection(
        Projections.projectionList()
        .add(Projections.property("train"))
        .add(Projections.max("time"))
        .add(Property.forName("train").group())
        );

TrainTable

Train    Dest      Time
1        HK        10:00
1        SH        12:00
1        SZ        14:00
2        HK        13:00
2        SH        09:00
2        SZ        07:00

SQL

SELECT t.Train, t.Dest, r.MaxTime
FROM (
      SELECT Train, MAX(Time) as MaxTime
      FROM TrainTable
      GROUP BY Train
) r
INNER JOIN TrainTable t
ON t.Train = r.Train AND t.Time = r.MaxTime

Результат

Train    Dest      Time
1        SZ        14:00
2        HK        13:00

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Учитывая то, что я не знаю моделей и их отношения, я думаю, что-то вроде этого поможет вам:

Criteria cr = session.createCriteria(R.class)
        .setProjection(Projections.projectionList()
        .add(Projections.property("train"), "train")
        .add(Projections.property("dest"), "dest"))
        .add( Projections.groupProperty("train"), "train" )
        .createCriteria("trainTable").add(Projections.max("maxTime"))
        .setResultTransformer(Transformers.aliasToBean(R.class));

      List<R> list = cr.list();

Для получения дополнительной информации, попробуйте поискать в это руководство и это тоже

0 голосов
/ 23 мая 2018

Просто сделайте с nativequery для непосредственного запуска MySQL-запроса.Это самый простой и лучший способ.Пожалуйста, попробуйте это:

@Autowired
    private SessionFactory mySessionFactory;


    String query ="SELECT t.Train, t.Dest, r.MaxTime "
       +" FROM (SELECT Train, MAX(Time) as MaxTime FROM TrainTable GROUP BY Train) r "
       +" INNER JOIN TrainTable t "
       +" ON t.Train = r.Train AND t.Time = r.MaxTime";

    List<Object[]> list = (List<Object[]>) mySessionFactory.getCurrentSession().createNativeQuery(query)
                    .getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...