0

嗨,请在下表和查询。这取自其他人的帖子,但完全符合我的需要。我想创建与该表下方的 sql 产生相同结果的 Hibernate Criteria(无 HQL 或 SQL)。

知道怎么做吗?

这是我尝试过但它不正确的方法。

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

火车表

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
4

2 回答 2

0

鉴于我不知道模型及其关系,我认为这样的事情会指导你:

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();

有关更多信息,请尝试在本教程本教程中进行研究

于 2018-05-23T17:15:52.117 回答
0

只需使用 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();
于 2018-05-23T15:20:43.740 回答