MyBatisでの一対多のネストされたクエリの実現方法は何ですか?
MyBatisでは、ネストされたクエリ(Nested Query)を使って、1対多の関係をクエリすることができます。
最初に、2つのエンティティクラスを定義する必要があります:一方向のエンティティクラスと多方向のエンティティクラス。たとえば、UserクラスとOrderクラスを定義し、1人のユーザーが複数の注文を持つことができるようにします。
public class User {
private Integer id;
private String username;
private List<Order> orders;
// 省略getter和setter方法
}
public class Order {
private Integer id;
private String orderNo;
private Integer userId;
// 省略getter和setter方法
}
その後、Mapperインターフェース内で2つのメソッドを定義します。1つはユーザ情報を検索するメソッドであり、もう1つはユーザに関連する注文情報を検索するメソッドです。
public interface UserMapper {
User getUser(Integer id);
List<Order> getOrdersByUserId(Integer userId);
}
次に、これらの2つのメソッドをMapper.xmlファイルで実装します。
最初にgetUserメソッドを実装します。
<select id="getUser" parameterType="Integer" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
その後、getOrdersByUserIdメソッドを実装してください。
<select id="getOrdersByUserId" parameterType="Integer" resultType="Order">
SELECT * FROM orders WHERE userId = #{userId}
</select>
最終的に、ネストされたクエリを使用して、1対多の関係を検索します。 getUserメソッドで注文情報をネストしたクエリとして取得します。
<select id="getUser" parameterType="Integer" resultType="User">
SELECT * FROM user WHERE id = #{id}
<collection property="orders" ofType="Order" select="getOrdersByUserId">
<id property="userId" column="id"/>
</collection>
</select>
このようにして、getUserメソッドを使用してユーザーとそのユーザーに関連するすべての注文情報を取得することができます。
User user = userMapper.getUser(1);
System.out.println(user.getUsername());
for (Order order : user.getOrders()) {
System.out.println(order.getOrderNo());
}
MyBatisを使用して、一対多のネストされたクエリを実装する方法を説明しました。ネストされたクエリを使用することで、一対多の関係を持つデータを簡単に取得できます。