如何将列表列表转换为对象列表

时间:2019-09-25 09:01:47

标签: java spring hibernate jpa criteria

我有一个执行查询并根据给定参数返回列表列表的存储库。我想将此列表列表转换为对象列表。

现在这是我的存储库:

    @Repository
    public class AlarmDynamicSelection {

      private EntityManagerFactory emf;

      @PersistenceUnit
      public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
      }

      public List<Object> alarmSelection(List<String> fields, Map<String, Object> filters){
        EntityManager em = this.emf.createEntityManager();
        CriteriaBuilder builder = em.getCriteriaBuilder();

        CriteriaQuery<Object> criteria = builder.createQuery( Object.class );
        Root<ActiveAlarm> root = criteria.from( ActiveAlarm.class );
        root.join("alarmClass", JoinType.LEFT);
        root.join("networkElement", JoinType.LEFT);

        List<Selection<?>> selectList = new LinkedList();
        for (String item : fields) {
          selectList.add(root.get(item));
        }

        criteria.multiselect(selectList);

        ArrayList<Predicate> predicates = new ArrayList<>();
        if (filters.get("details") != null) {
          predicates.add(builder.like(builder.upper(root.get("details")), "%" + filters.get("details").toString().toUpperCase() + "%"));
        }
        if (filters.get("networkElement") != null) {
          predicates.add(builder.like(builder.upper(root.join("networkElement").get("label")),
              "%" + filters.get("networkElement").toString().toUpperCase() + "%"));
        }

        criteria.where(builder.and(predicates.toArray(new Predicate[0])));

        List<Object> results = em.createQuery( criteria ).getResultList();  

        return results;
      }
    }

参数为:

    "fields": ["id", "details", "networkElement"], 
    "filters": {"id":[312,34], "details":"a" }

从存储库返回的结果:

    [
        [
            123,
            "adasd",
            {
                "id": 20,
                "label": "test"
            }
        ],
        [
            34,
            "dfakrgfA",
            {
                "id": 1,
                "label": "net"
            }
        ],
        [
            312,
            "dgfsesadfsafdf",
            {
                "id": 1,
                "label": "net"
            }
        ]
    ]

我想将上述结果更改如下:

    [
      {
        "id": 123,
        "details": "adasd",
        "networkElement": {
          "id": 20,
          "label": "test"
        }
      },
      {
        "id": 34,
        "details": "dfakrgfA",
        "networkElement": {
          "id": 1,
          "label": "net"
        }
      },
      {
        "id": 312,
        "details": "dgfsesadfsafdf",
        "networkElement": {
          "id": 1,
          "label": "net"
        }
      }
    ]

对象键必须来自field参数

0 个答案:

没有答案