Использование <collection>в MyBatis3 дает NULL для списка элементов - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь использовать <collection> в MyBatis3 .Однако все элементы, составляющие часть List/collection, всегда равны NULL.

Вот мой SQL -

<select id="fetchPaymentWorkingALL" resultType="paymentWorkingALL" parameterType="java.util.Map">
    select
        (person_id + '-' + convert(char(10), end_date, 126) + '-' + company + '-' + plan) as paymentid
         ,person_id as personid
         ,(person_id + '-' + convert(char(10), end_date, 126) + '-' + company + '-' + plan + '-' + 'non_mid_year') as otherid
         ,'non_mid_year' as typename
         ,'0' as typeid
         ,sum(amount) as amount
         ,sum(return1_amount) + sum(return2_amount) as returnamount
         ,sum(endamount) as endamount
    from #ABCD
    group by person_id, income_type, end_date, company, plan, plan_id
</select>

Вывод запроса выглядит следующим образом -

paymentid                        | personid    | otherid                                       | typename        | typeid  |     amount        | returnamount  | endamount
---------------------------------|-------------|-----------------------------------------------|-----------------|---------|-------------------|---------------|------------------
3520-2017-12-31-ABCD-Mandatory   | 3520        | 3520-2017-12-31-ABCD-Mandatory-non_mid_year   | non_mid_year    |    0    |    10000.0000     | 1200.0000     | 11200.0000
3520-2017-12-31-ABCD-Mandatory   | 3520        | 3520-2017-12-31-ABCD-Mandatory-total          | total           |    2    |    10000.0000     | 1200.0000     | 11200.0000
3520-2018-12-31-ABCD-Mandatory   | 3520        | 3520-2018-12-31-ABCD-Mandatory-mid_year       | mid_year        |    1    |    15000.0000     | 1150.0000     | 16150.0000
3520-2018-12-31-ABCD-Mandatory   | 3520        | 3520-2018-12-31-ABCD-Mandatory-non_mid_year   | non_mid_year    |    0    |    10000.0000     | 1200.0000     | 11200.0000
3520-2018-12-31-ABCD-Mandatory   | 3520        | 3520-2018-12-31-ABCD-Mandatory-total          | total           |    2    |    25000.0000     | 2350.0000     | 27350.0000
3520-2019-12-31-EFGH-Mandatory   | 3520        | 3520-2019-12-31-EFGH-Mandatory-non_mid_year   | non_mid_year    |    0    |    10000.0000     | 1200.0000     | 11200.0000
3520-2019-12-31-EFGH-Mandatory   | 3520        | 3520-2019-12-31-EFGH-Mandatory-total          | total           |    2    |    10000.0000     | 1200.0000     | 11200.0000
3520-2019-12-31-ABCD-Mandatory   | 3520        | 3520-2019-12-31-ABCD-Mandatory-mid_year       | mid_year        |    1    |    15000.0000     | 1150.0000     | 16150.0000
3520-2019-12-31-ABCD-Mandatory   | 3520        | 3520-2019-12-31-ABCD-Mandatory-non_mid_year   | non_mid_year    |    0    |    10000.0000     | 1200.0000     | 11200.0000
3520-2019-12-31-ABCD-Mandatory   | 3520        | 3520-2019-12-31-ABCD-Mandatory-total          | total           |    2    |    25000.0000     | 2350.0000     | 27350.0000
3520-2020-12-31-ABCD-Mandatory   | 3520        | 3520-2020-12-31-ABCD-Mandatory-mid_year       | mid_year        |    1    |    15000.0000     | 1150.0000     | 16150.0000
3520-2020-12-31-ABCD-Mandatory   | 3520        | 3520-2020-12-31-ABCD-Mandatory-total          | total           |    2    |    15000.0000     | 1150.0000     | 16150.0000

resultMaps выглядит так -

<resultMap id="paymentWorkingALL" type="PaymentWorkingALL">
    <id property="paymentid" column="paymentid" />
    <result property="personid" column="personid" />
    <collection property="paymentWorkings"
        ofType="PaymentWorking"
        resultMap="paymentWorkingMap" />

</resultMap>

<resultMap id="paymentWorkingMap" type="PaymentWorking">
    <id property="otherid" column="otherid" />
    <result property="typename" column="typename"/>
    <result property="typeid" column="typeid"/>
    <result property="amount" column="amount"/>
    <result property="endamount" column="endamount"/>
    <result property="returnamount" column="returnamount"/>
</resultMap>

Я также добавил псевдонимы так -

<typeAlias type="com.abcd.PaymentWorkingALL" alias="PaymentWorkingALL"/>
<typeAlias type="com.abcd.PaymentWorking" alias="PaymentWorking"/>

и мои классы выглядят так -

public class PaymentWorkingALL {

    private String paymentid;
    private String personid;
    private List<PaymentWorking> paymentWorkings;

    public String getPaymentid() {
        return paymentid;
    }

    public void setPaymentid(String paymentid) {
        this.paymentid = paymentid;
    }

    public String getPersonid() {
        return personid;
    }

    public void setPersonid(String personid) {
        this.personid = personid;
    }

    public List<PaymentWorking> getPaymentWorkings() {
        return paymentWorkings;
    }

    public void setPaymentWorkings(List<PaymentWorking> paymentWorkings) {
        this.paymentWorkings = paymentWorkings;
    }
}
public class PaymentWorking {

    private String otherid;
    private String typename;
    private String typeid;
    private Double amount;
    private Double returnamount;
    private Double endamount;

    public String getOtherid() {
        return otherid;
    }

    public void setOtherid(String otherid) {
        this.otherid = otherid;
    }

    public String getTypename() {
        return typename;
    }

    public void setTypename(String typename) {
        this.typename = typename;
    }

    public String getTypeid() {
        return typeid;
    }

    public void setTypeid(String typeid) {
        this.typeid = typeid;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public Double getReturnamount() {
        return returnamount;
    }

    public void setReturnamount(Double returnamount) {
        this.returnamount = returnamount;
    }

    public Double getEndamount() {
        return endamount;
    }

    public void setEndamount(Double endamount) {
        this.endamount = endamount;
    }
}

Я ожидал, что получу список, который будет выглядеть следующим образом -

[
  {
    "paymentid": "3520-2017-12-31-ABCD-Mandatory",
    "personid": "3520",
    "paymentWorkings": [
      {
        "otherid": "3520-2017-12-31-ABCD-Mandatory-non_mid_year",
        "typename": "non_mid_year",
        "typeid": "0",
        "amount": 10000.00,
        "returnamount": 1200.00,
        "endamount": 11200.00      
      },
      {
        "otherid": "3520-2017-12-31-ABCD-Mandatory-total",
        "typename": "total",
        "typeid": "2",
        "amount": 10000.00,
        "returnamount": 1200.00,
        "endamount": 11200.00      
      }
    ]
  },
  {
    "paymentid": "3520-2018-12-31-ABCD-Mandatory",
    "personid": "3520",
    "paymentWorkings": [
      {
        "otherid": "3520-2018-12-31-ABCD-Mandatory-non_mid_year",
        "typename": "non_mid_year",
        "typeid": "0",
        "amount": 10000.00,
        "returnamount": 1200.00,
        "endamount": 11200.00      
      },
      {
        "otherid": "3520-2018-12-31-ABCD-Mandatory-mid_year",
        "typename": "mid_year",
        "typeid": "1",
        "amount": 15000.00,
        "returnamount": 1150.00,
        "endamount": 16150.00      
      },
      {
        "otherid": "3520-2018-12-31-ABCD-Mandatory-total",
        "typename": "total",
        "typeid": "2",
        "amount": 25000.00,
        "returnamount": 2350.00,
        "endamount": 27350.00      
      }
    ]
  }
]

Однако, когда запрос выполняется, я получаю List<PaymentWorkingALL> с размером 12 и с каждым paymentWorkings как NULL.

Насколько я понимаю, он должен был вернуть List<PaymentWorkingALL> длины 5 и их идентификаторы будут одним из -

'3520-2017-12-31-ABCD-Mandatory',
'3520-2018-12-31-ABCD-Mandatory',
'3520-2019-12-31-EFGH-Mandatory',
'3520-2019-12-31-ABCD-Mandatory',
'3520-2020-12-31-ABCD-Mandatory'

Я использую следующие версии mybatis и mybatis-spring -

<mybatis.version>3.2.3</mybatis.version>
<mybatis.spring.version>1.2.0</mybatis.spring.version>

1 Ответ

0 голосов
/ 02 апреля 2019

paymentWorkingALL карта результатов не используется, потому что вы не указали mybatis использовать ее, поэтому она имеет два последствия:

  1. mybatis не знает, что такое поле id поляPaymentWorkingALL и обрабатывает все строки как уникальные объекты (следовательно, 12 объектов в результате)
  2. paymentWorkings связь не отображается вообще (поэтому объекты не создаются в коллекции)

Чтобы исправить это, укажите карту результата в качестве атрибута узла select следующим образом:

<select id="fetchPaymentWorkingALL" resultMap="paymentWorkingALL" parameterType="java.util.Map">
 ...
</select>

...