Mybatisで副問い合わせを実装する方法

Mybatisで副問い合わせを実装する方法

Mybatisで副問い合わせを実装する方法について説明します。
以下は、test_userテーブルから特定の条件に一致するデータを取得する例です。

まず、test_userテーブルとtest_orderテーブルを考えます。
test_orderテーブルにはユーザーIDが含まれており、test_userテーブルから最も最近の注文を取得する副問い合わせを実装します。

MybatisのXML設定

SQLマッパー設定(UserMapper.xml)
<mapper namespace="com.example.mapper.UserMapper">

    <!-- メインのSQLクエリ -->
    <select id="selectUserWithLatestOrder" parameterType="int" resultType="User">
        SELECT *
        FROM test_user
        WHERE id = (
            SELECT user_id
            FROM test_order
            WHERE order_date = (
                SELECT MAX(order_date)
                FROM test_order
                WHERE user_id = test_user.id
            )
        )
    </select>

</mapper>

Javaのマッパーインターフェース

マッパーインターフェース(UserMapper.java)
package com.example.mapper;

import com.example.model.User;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {

    @Select("SELECT * FROM test_user WHERE id = (SELECT user_id FROM test_order WHERE order_date = (SELECT MAX(order_date) FROM test_order WHERE user_id = test_user.id))")
    User selectUserWithLatestOrder(int userId);
}

データモデル

データモデル(User.java)
package com.example.model;

public class User {
    private int id;
    private String name;
    // その他のフィールドとゲッター・セッター
}

この例では、副問い合わせを使って最も最近の注文に関連するユーザーをtest_userテーブルから取得しています。
test_orderテーブルの注文日で最も新しい注文を持つユーザーを検索します。