Зависимость ассоциации MyBatis от порядка по - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь получить данные, используя ассоциацию MyBatis. Полученные данные включают в себя список лиц, каждый из которых имеет список компаний, связанных с ними. (см. POJO) В настоящее время в БД всего два человека, скажем, P1 и P0. P1 связан с компанией C1 и C2, а P0 связан только с C1. (см. результат sql)

Моя карта результатов содержит карту для человека, которая сама содержит ассоциацию карты для компании. (см. карту результатов)

Когда я выбираю данные в sql, три строки идут в следующем порядке: (см. Sql result)

  1. P1 с C1
  2. P0 с C1
  3. P1 с C2

Когда я использую «заказ по лицу, компания», я получаю правильный объект, т. Е. Список людей, имеющих два значения: одно для P1 и другое для P0, причем P1 имеет список C1 и C2, а P0 имеет список только С1. (см. JSON # 1)

Однако, когда я не использую «упорядочить по», я получаю неправильный список объектов, имеющий два объекта P1 (имеющий список C1 и C2). Там нет объекта P0. (см. JSON # 2)

Я пытался использовать идентификатор (в качестве уникального идентификатора) для карты результатов компании и человека. Я также попробовал вложенное отображение.

Java сторона:

POJO:


public class Person {
    private String personId;
    private String firstName;
    private String lastName;
    private List<CompanyWiseDetails> companyWiseDetails;

    // setters and getters
}

public class CompanyWiseDetails {
    private String companyId;
    private String companyName;
    private String payrollCycle;
    private Double januaryCatch;


    // setters and getters
}

DAO:

final Map<Object, Object> paramMap = new HashMap<Object, Object>();
paramMap.put("universeEndDate", this.getUniverseEndDate());
paramMap.put("projectionDate", projectionDate);
SqlSession.selectList("fetchData")

Карта результатов:

<resultMap id="person" type="Person">
    <id property="personId" column="person_id" />
    <result property="firstName" column="first_name" />
    <result property="lastName" column="last_name" />
    <!-- few other fields which can be null -->
    <collection
            property="companyWiseDetailsList"
            resultMap="companyEntityWiseDetails" />
</resultMap>

<resultMap id="companyEntityWiseDetails"
            type="CompanyWiseDetails">
    <id property="companyId" column="company_id" />
    <result property="companyName" column="company_name" />
    <result property="payrollCycle" column="payroll_cycle" />
    <!-- few other fields which can be null -->
</resultMap>

SQL:

<select id="fetchData" resultMap="person" >
    <include refid="toCreateTemporary_table"/>
    select
        table_one.person_id as person_id,
        company_table.hr_company_code as company_id,
        tCompany.PayrollCycle as payroll_cycle
    from table_one table_one
        join company_table_strategy company_table
            on company_table.person_id =  table_one.person_id
            and company_table.as_on_date = #{projectionDate}
            and company_table.tt_end= #{universeEndDate}
        join tCompany
            on company_table.hr_company_code = tCompany.HRCompanyCode
        left join
            #temporary_table
            on #temporary_table.company_id = company_table.hr_company_code
            and #temporary_table.person_id = table_one.person_id
    where
        table_one.as_on_date = #{projectionDate}
        and table_one.tt_end= #{universeEndDate}
    order by
        person_id, entity_id
    drop table #temporary_table
     </select>

Вывод SQL


person_id    company_id    payroll_cycle    company_name    cash_compensation    random_percentage    income             comp           field1             bonus             field2
P1           C1            bi_weekly        C1_name         5000.00000000        50.00000000          200112.10000000    60.10000000    NULL               NULL              NULL
P0           C1            bi_weekly        C1_name         5000.00000000        50.00000000          100112.10000000    30.10000000    NULL               NULL              NULL
P1           C2            bi_weekly        C2_name         5000.00000000        50.00000000          200112.10000000    30.10000000    362906.82000000    25000.00000000    1000.00000000

Ответ JSON при использовании order by:

[
    {
        "personId": "P0",
        "firstName": null,
        "lastName": null,
        "companyEntityWiseDetailsList": [
            {
                "companyId": "C1",
                "companyName": null,
                "payrollCycle": "bi_weekly"
            }
        ]
    },
    {
        "personId": "P1",
        "firstName": null,
        "lastName": null,
        "companyEntityWiseDetailsList": [
            {
                "companyId": "C1",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            },
            {
                "companyId": "C2",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            }
        ]
    }
]

Ответ JSON, когда order by не используется:

[
    {
        "personId": "P1",
        "firstName": null,
        "lastName": null,
        "companyEntityWiseDetailsList": [
            {
                "companyId": "C1",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            },
            {
                "companyId": "C2",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            }
        ]
    },
    {
        "personId": "P1",
        "firstName": null,
        "lastName": null,
        "companyEntityWiseDetailsList": [
            {
                "companyId": "C1",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            },
            {
                "companyId": "C2",
                "companyName": null,
                "payrollCycle": "bi_weekly",
            }
        ]
    }
]

Должен ли "упорядочить" повлиять на результат

...