🐡

MyBatis Dynamic SQLとGeneratorでMAX関数を使う

2023/03/12に公開

想定通りに動かないかもしれません

一つのテーブルから最終更新日のレコードを取得する例です。
割と調べるのに手間取ったのでキャッシュ的に残しておく判断をしました。

生成SQLクエリ

select ID, NAME, CREATED, max(UPDATED) from history group by NAME

元となるJavaコード

import static org.mybatis.dynamic.sql.SqlBuilder.*;  // select() 使うために必要
public List<History> findLaterHistory() {
    return historyMapper.selectMany(
        select(
            HistoryDynamicSqlSupport.id,
            HistoryDynamicSqlSupport.name,
            max(HistoryDynamicSqlSupport.updated)           // ここが重要
	      .as(HistoryDynamicSqlSupport.updated.name())  // ここも重要(無いと null になる)
        )
        .from(HistoryDynamicSqlSupport.history)
        .groupBy(HistoryDynamicSqlSupport.name)
        .build()
        .render(RenderingStrategies.MYBATIS3)
    );
}

Javaコードにすると見た目が大分煩雑です。MyBatis GeneratorでSQL(O/R)マッピングの恩恵は受けられるのはいいんですが・・・ with(HistoryDynamicSqlSupport, () -> it.history) とか出来たらもっとシンプルになると思うんですけどね。

Javaコード内でSQLチェックしたい場合は select().getSelectStatement() で見れます。

参考

Discussion