簡體   English   中英

在 Mybatis (Mapper) 和 Java 中的屬性 List 中分組結果

[英]Group result in List that is an attribute in Mybatis (Mapper) and Java

我有一個關於 Mybatis 中的 Mappers 的問題。 我有兩個這樣的課程:

public class A{
  private String A1;
  private String A2;
  private List<B> listB;
  //getters and setters
  .
  .
  .
  public static class B {
   private String B1;
   private String B2;
   //getters and setters
   .
   .
   .

  }

}

然后我有一個像這樣的映射器 class :

@Mapper
public interface ABMapper{

@Select("select b1,b2 from b where b.a1 = #{a1}")
public List<B> getBs(@Param("a1") String a1);

@Select ("select a1,a2 from a limit 100")
@Results({
@Result(property="a1", value = "a1"),
@Result(property="a2", value = "a2"),
@Result(property="listB", column="a1", many = @Many(select = "getBs"))
})
public List<A> getAs();
}

這很好用,但我知道當getAs()執行時,getBs 運行的次數與項目的次數一樣多(限制 100 是一個例子)。 我想知道是否存在一種方法來運行像select a.a1,a.a2,b.b1,b.b2 from aa inner join bb on a.a1 = b.a1然后 Mybatis(和 Java)可以分組List<A>中的元素並且屬性 B 不為空。 也許,有必要在 class A 和 B 中使用 hash 和 equals,但我不知道。

感謝您的回答。

Mybatis 可以做到這一點,但前提是你使用 xml 映射。 java 中注釋的限制使得 map 無法與 join 關聯:

您會注意到注釋 API 不支持連接映射。 這是由於 Java 注釋中的限制不允許循環引用。

在這種情況下,映射可能如下所示:

<resultMap id="bMap" type="B">
  <id property="b1" column="b1"/>
  <result property="b2" column="b2"/>
</resultMap>

<resultMap id="aMap" type="A">
    <id property="a1" column="a1"/>
    <result property="a2" column="a2"/>
    <collection property="listB" javaType="B" resultMap="bMap" columnPrefix="b_"/>
</resultMap>

<select id='getAs' resultMap='aMap'>
SELECT a.*, b.id B_id, b.b1 B_b1, b.b2 B_b2
FROM (
   select *
   from a
   LIMIT 100
  ) AS a
  LEFT JOIN AS b on a.a1 = b.a1
</select>

一些重要的注意事項:

  1. AB都應該有一些使用id元素配置的標識字段。 此字段中的值將用於識別 object 並執行您所謂的分組。 對於表a這似乎是a1 (因為您將其用作連接字段),我在示例中使用了它。
  2. 如果要映射許多字段, resultMap中的autoMapping="true"可能會很有用
  3. 您需要使用左/右連接來處理表a中沒有任何內容的記錄b
  4. 為了LIMIT與 join 一起正常工作,您需要在 select 上執行此操作,該 select 從a而不是在連接結果中獲取記錄,否則如果來自b的 100 多條記錄被連接,您可能會在結果中獲得少於 100 條記錄。
  5. 這取決於用例,但通常如果您使用LIMIT ,您需要指定一些順序,否則記錄將以不可預測的順序返回。
  6. 在舊版本的 mybatis 中存在一個錯誤,要求查詢中的列前綴應為大寫(可能現在已修復,我不確定)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM