背景
開発プロジェクトではデータが1対多になるケースが多く、企業情報の一覧情報を問い合わせる際に複数の企業のタグを一覧表示する必要があります。現時点では、mybatis を使用して上記の要件のデータ情報を構築できます。
必要
通常、1 対多のクエリには 2 つのエンティティ クラスが含まれます。1 つはパーティ エンティティ クラス、もう 1 つはマルチパーティ エンティティ クラスです。たとえば、会社が複数のタグを持つことができる場合、その会社は一パーティ エンティティ クラスであり、タグは複数パーティ エンティティ クラスになります。
企業リスト情報をクエリする場合、企業の基本情報に加えて、企業の複数のタグ情報も返す必要があります。
最初の実装
SQL の関連付けを使用してすべてのデータをクエリし、コレクション タグを使用して戻り値をフォーマットします。コードの一部は次のとおりです。
<!-- 映射结果集 SerCompanyVO -->
<resultMap id="resultMap" type="SerCompanyVO">
<id column="company_id" property="companyId" jdbcType="INTEGER" />
<result column="company_name" property="companyName" jdbcType="VARCHAR" />
<result column="company_code" property="companyCode" jdbcType="VARCHAR" />
<result column="company_msg" property="companyMsg" jdbcType="VARCHAR" />
<result column="company_crdt" property="companyCrdt" jdbcType="VARCHAR" />
</resultMap>
<!-- 一对多查询 join 结果集 -->
<resultMap id="tagResultMap" type="SerCompanyVO" extends="resultMap">
<collection property="list" ofType="SerCompanyTagVO">
<id column="tag_id" property="tagId" jdbcType="INTEGER" />
<result column="tag_name" property="tagName" jdbcType="VARCHAR" />
<result column="tag_msg" property="tagMsg" jdbcType="VARCHAR" />
</collection>
</resultMap>
<!-- 一对多查询 join 语句-->
<select id="selectSerCompanyListTagJoin" resultMap="tagResultMap">
SELECT c.company_id,c.company_name, company_code, company_msg, company_crdt,
t.tag_id,t.tag_msg,t.tag_name FROM ser_company c
LEFT JOIN ser_company_tag t ON c.company_id = t.company_id
</select>
selectSerCompanyListTagJoin を使用して、会社情報および関連する会社タグ情報を照会します。次に、tagResultMap を使用して、結果セットを SerCompanyVO エンティティ クラスにマップします。list は、SerCompanyVO エンティティ クラスのラベル クラスのコレクションです。インターフェイスが呼び出された後、次のデータが返されます。
2回目の実装
インターフェイスを使用してメイン テーブル データをクエリし、関連付けタグを介してセカンダリ サブクエリを実行して、関連付けられたデータを返します。具体的なコードは次のとおりです。
<!-- 映射结果集 SerCompanyVO -->
<resultMap id="resultMap" type="SerCompanyVO">
<id column="company_id" property="companyId" jdbcType="INTEGER" />
<result column="company_name" property="companyName" jdbcType="VARCHAR" />
<result column="company_code" property="companyCode" jdbcType="VARCHAR" />
<result column="company_msg" property="companyMsg" jdbcType="VARCHAR" />
<result column="company_crdt" property="companyCrdt" jdbcType="VARCHAR" />
</resultMap>
<!-- 映射结果集 SerCompanyTagVO -->
<resultMap id="serCompanyTagResultMap" type="SerCompanyTagVO">
<id column="tag_id" property="tagId" jdbcType="INTEGER" />
<result column="tag_name" property="tagName" jdbcType="VARCHAR" />
<result column="tag_msg" property="tagMsg" jdbcType="VARCHAR" />
<result column="company_id" property="companyId" jdbcType="INTEGER" />
</resultMap>
<!-- 一对多查询 asso 结果集 -->
<resultMap id="assoResultMap" type="com.study.model.SerCompanyVO" extends="resultMap">
<association property="list" column="company_id" select="getSerCompanyTag"/>
</resultMap>
<!-- 一对多查询 asso方式 子表查询 -->
<select id="selectSerCompanyListTagAsso" resultMap="assoResultMap">
select company_id,company_name, company_code, company_msg, company_crdt from ser_company
</select>
<!-- 一对多查询 asso方式 主表查询 -->
<select id="getSerCompanyTag" resultMap="serCompanyTagResultMap" parameterType="int">
select t.company_id,t.tag_id,t.tag_msg,t.tag_name from ser_company_tag t where t.company_id=#{companyId}
</select>
まず、selectSerCompanyListTagAsso を呼び出してメイン テーブル情報をクエリし、結果セットを返すときに、アソシエーションを介してセット選択サブクエリを呼び出して二次クエリを実行します。これが getSerCompanyTag インターフェイスです。次に、結果セットを再編成します。結果は次のとおりです。
要約する
2 番目の方法はあまり役に立ちませんが、リスト クエリ インターフェイスに適しています。メイン テーブルがデータを返すのと同じ回数だけサブクエリがクエリされます。これはデータベース リソースの無駄であるため、クエリには最初の方法を使用することをお勧めします。
最初の方法では、必要に応じて内部結合関連付けを使用してください (これは 1 対多を返す例にすぎません)。
エンティティクラスのソースコード
@Alias("SerCompanyTagVO")
public class SerCompanyTagVO {
private int tagId;
private String tagName;
private String tagMsg;
private int companyId;
public int getTagId() {
return tagId;
}
public void setTagId(int tagId) {
this.tagId = tagId;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public String getTagMsg() {
return tagMsg;
}
public void setTagMsg(String tagMsg) {
this.tagMsg = tagMsg;
}
public int getCompanyId() {
return companyId;
}
public void setCompanyId(int companyId) {
this.companyId = companyId;
}
}
@Alias("SerCompanyVO")
public class SerCompanyVO {
private int companyId;
private String companyName;
private String companyCode;
private String companyMsg;
private String companyCrdt;
private List<SerCompanyTagVO> list;
private SerCompanyTagVO serCompanyTagVO;
public int getCompanyId() {
return companyId;
}
public void setCompanyId(int companyId) {
this.companyId = companyId;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getCompanyCode() {
return companyCode;
}
public void setCompanyCode(String companyCode) {
this.companyCode = companyCode;
}
public String getCompanyMsg() {
return companyMsg;
}
public void setCompanyMsg(String companyMsg) {
this.companyMsg = companyMsg;
}
public String getCompanyCrdt() {
return companyCrdt;
}
public void setCompanyCrdt(String companyCrdt) {
this.companyCrdt = companyCrdt;
}
public List<SerCompanyTagVO> getList() {
return list;
}
public void setList(List<SerCompanyTagVO> list) {
this.list = list;
}
public SerCompanyTagVO getSerCompanyTagVO() {
return serCompanyTagVO;
}
public void setSerCompanyTagVO(SerCompanyTagVO serCompanyTagVO) {
this.serCompanyTagVO = serCompanyTagVO;
}
}
dao レイヤーのソースコード
@Mapper
public interface SerCompanyMapper {
/**
* 一对多查询公司信息 包含公司标签 join 方式
* @return
*/
List<SerCompanyVO> selectSerCompanyListTagJoin();
/**
* 一对多查询公司信息 包含公司标签 asso 方式
* @return
*/
List<SerCompanyVO> selectSerCompanyListTagAsso();
/**
* 一对多查询公司信息 包含公司标签 asso 方式
* @param companyId
* @return
*/
SerCompanyTagVO getSerCompanyTag(int companyId);
}
最後に書きます
オープンソースは美徳です。できるだけ早くオープンソース コミュニティに参加し、美しいエコシステムを一緒に構築してください。