首页 > 解决方案 > sql映射到json对象

问题描述

我正在寻找一种将查询映射到 json 对象的更好方法。

json对象的结构是 -

{
   "year":"2020",
   "month":[
      {
         "name":"January",
         "month":"1",
         "payroll_dates":[
            "1",
            "2"
         ],
         "holiday_dates":[
            "3",
            "4"
         ]
      },
      {
         "name":"Feburary",
         "month":"2",
         "payroll_dates":[
            "1",
            "2"
         ],
         "holiday_dates":[
            "3",
            "4"
         ]
      },
      {
         "name":"March",
         "month":"3",
         "payroll_dates":[
            "1",
            "2"
         ],
         "holiday_dates":[
            "3",
            "4"
         ]
      },
      {
         "name":"April",
         "month":"4",
         "payroll_dates":[
            "1",
            "2"
         ],
         "holiday_dates":[
            "3",
            "4"
         ]
      },
      {
         "name":"May",
         "month":"5",
         "payroll_dates":[
            "1",
            "2"
         ],
         "holiday_dates":[
            "3",
            "4"
         ]
      }
   ]
}

和数据库设计是:

   id | calendarDt | year | month | day | calendarType
   1. | 2020-1-25  | 2020 | 1     | 25  | Holiday
    2 | 2020-1-22  | 2020 | 1     | 22  | Holiday
    3 | 2020-1-13  | 2020 | 1     | 13  | Payday

这些是一月份的假期和发薪日的详细信息。

我使用的java代码是:

为每个月的假期创建了一个列表。为每个月创建一个工资单列表。每个月创建一个对象。然后在月份对象中设置列表。

在java中有更好的方法吗?

    List<String> payrollStringJan= new ArrayList<String>();
    List<String> holidayStringJan = new ArrayList<String>();
    Month janMonth = new Month();

    for (Calendar item: payrollCalendarList) {

        switch(item.getMonth()) {

        case 1:
            populateMonthObject(item, payrollStringJan, 
            holidayStringJan);
            break;

          }

            private void populateMonthObject(UhgCalendar item, 
         List<String> payrollString, List<String> holidayString) {
    if("Payday".equals(item.getCalendarType())) {
        payrollString.add(Integer.toString(item.getDay()));
    }
    if("Holiday".equals(item.getCalendarType())) {
        holidayString.add(Integer.toString(item.getDay()));
    }
}

Json pojo -

       public class PayrollCalendar {

    @JsonProperty("year")
    private String year;
    @JsonProperty("month")
    private List<Month> month = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
 //getter setter follow
} 

    public class Month {

    @JsonProperty("name")
    private String name;
    @JsonProperty("month")
    private String month;
    @JsonProperty("payroll_dates")
    private List<String> payrollDates = null;
    @JsonProperty("holiday_dates")
    private List<String> holidayDates = null;
    //getter setter follow
}
}

标签: javasqljson

解决方案


首先,我想了解为什么数据库是这样设计的。数据库可以只有日历日期和日历类型。如果您想要给定月份或几个月或一年中的假期/发薪日,您可以轻松编写查询。

就 Json 对象而言,如果客户想要所有日期,它可以简单地有一个发薪日数组和一个假期数组,我认为对于这个用例来说响应不会太大。


推荐阅读