当前位置: 首页 > 知识库问答 >
问题:

JPA,实体管理器,选择许多列并获取结果列表自定义对象

汝吕恭
2023-03-14

如何获取自定义对象列表,如以下查询结果:

SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id

举例来说:

return getEntityManager().createQuery("SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id").setParameter("id", id).getResultList();

我需要一个类别ID和类别中的产品数量的地图。

共有3个答案

夏理
2023-03-14

使用JPA2.0和EclipseLink impl

对于第一个问题:自定义对象列表(没有表对象):

回答:创建一个自定义模型,并使用@Entity和@Id

@Entity
public class QueryModelDTO implements Serializable{ 
    @Id
    private Integer categoryId;
    private int count;
    ---gets and sets
}

创建查询并执行

QueryModelDTO qm = (QueryModelDTO) em.createQuery(
                "SELECT p.category.id as categoryId, count(p.id) as count FROM Product p
                left join p.category c WHERE p.seller.id=:id 
                GROUP BY c.id",QueryModelDTO.class)
                .setParameter("id", id).getSingleResult();

第二:如何在地图上读取响应

回答:使用查询点和结果类型(这是@DannyMo答案的一个变体)

Query q  = em.createNativeQuery("SELECT * FROM Foo f");
q.setHint(QueryHints.RESULT_TYPE, ResultType.Map);
List<Map> lm = q.getResultList();
    for (Map map : lm) {
        for (Object entry : map.entrySet()) {
            Map.Entry<DatabaseField, Object> e = (Map.Entry<DatabaseField, Object>) entry;
            DatabaseField key = e.getKey();
            Object value = e.getValue();
            log.debug(key+"="+value);
        }            
    }

我希望这有帮助

羊冠玉
2023-03-14

假设您使用的是hibernate(标记),可以尝试下面的HQL查询,我还没有测试。

从产品p中选择新映射(p.category.id作为category\u id,count(p.id)作为id\u count)左加入p.category c,其中p.seller。id=:按c.id分组的id

范福
2023-03-14

不幸的是,JPA没有提供在Map中检索结果的标准方法。但是,通过遍历结果列表手动构建地图非常简单:

TypedQuery<Object[]> q = getEntityManager().createQuery(
    "SELECT c.id, count(p.id) " +
    "FROM Product p LEFT JOIN p.category c " +
    "WHERE p.seller.id = :id " +
    "GROUP BY c.id", Object[].class).setParameter("id", id);

List<Object[]> resultList = q.getResultList();
Map<String, Long> resultMap = new HashMap<String, Long>(resultList.size());
for (Object[] result : resultList)
  resultMap.put((String)result[0], (Long)result[1]);
 类似资料:
  • 问题内容: 如何获取自定义对象列表,例如查询以下结果: 例如: 我需要一张带有类别ID和类别中产品数量的地图。 问题答案: 不幸的是,JPA没有提供一种标准的方法来检索中的结果。但是,通过遍历结果列表来手动构建地图非常简单:

  • 我想使用以下查询获得结果列表: 我在它的实体类中使用了它,但我得到了异常: 当用户成功登录应用程序时,将获得matricula字段。应该通过CDI在NamedQuery中设置它来查询数据库。matricula字段位于另一个不同于此处映射的表中。 如何设置注入的setsionChave字符串在参数的矩阵,这是XRlzConsolado类类型? 豆子: 有3个实体:XRlz、XRlzConsolado

  • 在我的示例中,如何使用JPA CriteriaBuilder(如hibernate Criteria)这样的标准进行选择? 和

  • 我使用criteriaBuilder为特定类型创建criteriaQuery。 我需要在使用EntityManager的createQuery方法时限制查询的结果。 但我也需要知道有多少结果我可以得到没有限制,因为我需要它来计算页数的分页系统。 所以我使用了另一个criteriaQueryObject来创建一个选择计数

  • 你们知道如何忽略嵌套的“results”属性并直接获得列表吗?在这种情况下真的需要自定义反序列化器或包装器类吗? 谢了!

  • 我有一个问题 我有DTO 我的格言1。如何修复此错误以及此错误的含义?2.有没有更容易的方法得到这个结果?