如何高效将JPA查询两列结果存入Map并修改返回类型
如何将JPA查询结果转换为Map并修改返回类型?
首先得指出你当前代码里的一个潜在问题:你的JPA查询只选择了i.abcId和i.pAcq两列,但却指定返回CTM.class,这会导致JPA抛出异常——因为它没法把两列的结果映射到完整的CTM实体上。所以第一步得先修正查询的返回类型。
接下来我们一步步改造代码,实现把结果存入Map的需求:
步骤1:修改JPA查询的返回类型
因为我们只需要两列数据,推荐使用Tuple作为查询结果类型(比Object[]更直观,能通过列名获取值),或者也可以用Object[],这里用Tuple举例:
TypedQuery<Tuple> typedQuery = em.createQuery( "SELECT i.abcId , i.pAcq FROM CTM i where i.avJobCode = :avJobCode", Tuple.class );
步骤2:遍历结果并填充Map
获取查询结果后,循环遍历每一个Tuple,把abcId作为键,pAcq作为值存入HashMap:
Map<Integer, String> resultMap = new HashMap<>(); List<Tuple> tupleList = typedQuery.getResultList(); for (Tuple tuple : tupleList) { Integer abcId = (Integer) tuple.get("abcId"); String pAcq = (String) tuple.get("pAcq"); resultMap.put(abcId, pAcq); }
步骤3:修改方法的返回类型和返回值
把方法的返回类型从List<CTM>改成Map<Integer, String>,最后返回填充好的Map(注意getResultList()返回的是空List而不是null,不需要额外判空)。
完整修改后的代码
@Transactional public Map<Integer, String> fetchAllCTMinfo(String avJobCode) { TypedQuery<Tuple> typedQuery = em.createQuery( "SELECT i.abcId , i.pAcq FROM CTM i where i.avJobCode = :avJobCode", Tuple.class ); typedQuery.setParameter("avJobCode", avJobCode); Map<Integer, String> resultMap = new HashMap<>(); List<Tuple> tupleList = typedQuery.getResultList(); for (Tuple tuple : tupleList) { Integer abcId = (Integer) tuple.get("abcId"); String pAcq = (String) tuple.get("pAcq"); resultMap.put(abcId, pAcq); } return resultMap; }
可选:使用Java 8+的Stream简化代码
如果你的项目用的是Java 8或更高版本,还可以用Stream API来简化遍历填充Map的过程,代码更简洁:
@Transactional public Map<Integer, String> fetchAllCTMinfo(String avJobCode) { TypedQuery<Tuple> typedQuery = em.createQuery( "SELECT i.abcId , i.pAcq FROM CTM i where i.avJobCode = :avJobCode", Tuple.class ); typedQuery.setParameter("avJobCode", avJobCode); return typedQuery.getResultList().stream() .collect(Collectors.toMap( tuple -> (Integer) tuple.get("abcId"), tuple -> (String) tuple.get("pAcq") )); }
注意:如果查询结果中存在重复的abcId,Collectors.toMap()会抛出IllegalStateException,这时候可以添加一个合并函数处理冲突,比如保留第一个值:
Collectors.toMap( tuple -> (Integer) tuple.get("abcId"), tuple -> (String) tuple.get("pAcq"), (existingValue, newValue) -> existingValue )
内容的提问来源于stack exchange,提问作者FDFDGSFG DJDBM
相关产品推荐
相关产品推荐

