JPA,实体管理器,选择多列并获取结果列表自定义对象
Posted
技术标签:
【中文标题】JPA,实体管理器,选择多列并获取结果列表自定义对象【英文标题】:JPA, Entity manager, select many columns and get result list custom objects 【发布时间】:2013-06-16 15:25:11 【问题描述】:如何获取自定义对象列表,例如查询结果:
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 和类别中产品数量的地图。
【问题讨论】:
我建议查看this answer。这个答案有两个例子 1. 使用元组 2. 使用类和泛型 【参考方案1】:使用 JPA 2.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();
第二个:如何读取地图上的响应
回答:使用 QueryHints 和 ResultTypes(这是@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);
希望对你有帮助
【讨论】:
【参考方案2】:假设你使用的是hibernate(tagged),可以试试下面的HQL查询,我没测试过。
SELECT new map(p.category.id as category_id, count(p.id) as id_count) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id
【讨论】:
我刚刚在从自定义连接查询创建的自定义对象上进行了测试,并且它有效。我有一个带有键而不是数字索引的对象列表。顺序不会保留,但这并不重要,因为我们已经命名了要抓取的索引...【参考方案3】:不幸的是,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]);
【讨论】:
以上是关于JPA,实体管理器,选择多列并获取结果列表自定义对象的主要内容,如果未能解决你的问题,请参考以下文章