Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA,实体管理器,选择许多列并获取结果列表自定义对象_Java_Hibernate_Jpa_Jpa 2.0_Entitymanager - Fatal编程技术网

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

Java JPA,实体管理器,选择许多列并获取结果列表自定义对象,java,hibernate,jpa,jpa-2.0,entitymanager,Java,Hibernate,Jpa,Jpa 2.0,Entitymanager,如何获取自定义对象列表,如以下查询结果: 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 WHE

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

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和类别中产品数量的地图。

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

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]);
TypedQuery q=getEntityManager().createQuery(
选择c.id、计数(p.id)+
“从产品p左加入p类别c”+
“其中p.seller.id=:id”+
“按c.id分组”,对象[].class).setParameter(“id”,id);
List resultList=q.getResultList();
Map resultMap=newhashmap(resultList.size());
对于(对象[]结果:结果列表)
结果映射put((字符串)结果[0],(长)结果[1]);

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


使用JPA 2.0和EclipseLink impl从产品p中选择新地图(p.category.id作为category\u id,count(p.id)作为id\u count)左加入p.category c,其中p.seller.id=:id按c.id分组

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

回答:创建自定义模型并使用@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(“从Foo f中选择*);
q、 setHint(QueryHints.RESULT\u类型,ResultType.Map);
List lm=q.getResultList();
用于(地图:lm){
for(对象条目:map.entrySet()){
Map.Entry e=(Map.Entry)条目;
DatabaseField key=e.getKey();
对象值=e.getValue();
log.debug(键+“=”+值);
}            
}

我希望这有帮助

我建议退房。这个答案有两个例子1。使用元组2。使用一个类和泛型,我自己在一个自定义连接查询创建的自定义对象上进行了测试,结果成功了。我有一个带有键而不是数字索引的对象列表。顺序不会被保留,但这并不重要,因为我们已经命名了要获取的索引。。。
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);
        }            
    }