【问题标题】:Convert JPA query.getResultList() to MY Objects将 JPA query.getResultList() 转换为我的对象
【发布时间】:2014-06-23 09:16:29
【问题描述】:

我正在 JPA 中对我的数据库执行查询。 Query “查询” 4 个表,结果聚合来自不同表的列。

我的查询类似于:

Query query = em.createQuery("SELECT o.A, o.B, o.C, e.D, c.E FROM Table1 o, 
Table2 i, Table3 e, Table4 c WHERE o.X = i.X AND i.Y = e.Y AND i.Z = c.Z");

如何获取查询结果并提取不同的字段?

我创建了一个类 (MyObject) 来表示结果列表中的每一项,并且我想将 query.getResultList() 转换为 List

我该怎么做?

【问题讨论】:

    标签: java jpa jpql


    【解决方案1】:

    在大量研究发现这个可行的解决方案后,我遇到了同样的问题。 对于我的 HQL 查询,我想获得 POJO 列表的输出,但我得到的是 Object 列表。 这是获取 POJO 类列表的方法。

    可以通过两种方式实现:

    Query query = em.createNativeQuery(sqlQuery, Picking.class);
    OR
    查询查询 = em.createQuery(sqlQuery);

    NativeQuery 的工作示例:

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    
    @PersistenceContext
    protected EntityManager em;
    
    private <T> List getPickingQuery(Map<String, String> searchFields, Map<String, String> orderByFields,
                                                          Pageable pageable, String status) {
        List resultList = new ArrayList();
        try {
            String sql = "select * from picking where status = '" + status + "'";
            String sqlQuery = createQuery(sql, searchFields, orderByFields);
            Query query = em.createNativeQuery(sqlQuery, Picking.class);
    
            setQueryParam(sqlQuery, searchFields);
            query.setMaxResults(pageable.getPageSize());
            query.setFirstResult((int) pageable.getOffset());
            log.info("Query " + query);
            resultList = query.getResultList();
        } catch (Exception e) {
            log.error("Error " + e.getMessage());
        }
        return resultList;
    }
    
    private String createQuery(String sql, Map<String, String> searchFields, Map<String, String> orderByFields) {
        for (String paramName : searchFields.keySet()) {
            sql = sql.concat(" and " + paramName + " = ?");
        }
        if (orderByFields != null) {
            if (orderByFields.containsKey("key") && orderByFields.containsKey("order"))
                sql = sql.concat(" order by " + orderByFields.get("key") + " " + orderByFields.get("order"));
            else if (orderByFields.containsKey("key"))
                sql = sql.concat(" order by " + orderByFields.get("key"));
        }
        return sql;
    }
    
    private void setQueryParam(String sqlQuery, Map<String, String> searchFields) {
        int param = 1;
        for (String paramName : searchFields.keySet()) {
            query.setParameter(param++, searchFields.get(paramName));
        }
    }
    

    其他情况也可以参考这个链接:https://www.tabnine.com/code/java/methods/javax.persistence.Query/getResultList

    【讨论】:

      【解决方案2】:

      您正在寻找SELECT NEW 构造,在this answer 中进行了解释:

      "SELECT NEW your.package.MyObject(o.A, o.B, o.C, e.D, c.E) 
         FROM Table1 o, Table2 i, Table4 c
         WHERE o.X = i.X AND i.Y = e.Y AND i.Z = c.Z"
      

      当然,你的MyObject 必须有一个匹配的构造函数。

      【讨论】:

        【解决方案3】:

        这种查询返回List&lt;Object[]&gt;。所以你只需要一个循环来将每个数组转换为你的类的一个实例:

        List<Object[]> rows = query.getResultList();
        List<MyObject> result = new ArrayList<>(rows.size());
        for (Object[] row : rows) {
            result.add(new MyObject((String) row[0],
                                    (Long) row[1],
                                    ...));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-02
          • 2010-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多