经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
基于spring?data?jpa?@query返回map的踩坑记录
来源:jb51  时间:2021/11/22 11:32:05  对本文有异议

spring data jpa @query返回map踩坑记录

最近用spring data jpa,网上看的一些教程,有的说是返回的Object[]数组,有的说是直接返回的对象,亲身验证了一下,发现主要看写法和返回结果。

用的版本是这样的:

dao代码如下:

  1. public interface UserRepository extends JpaRepository<User, Integer> {
  2. /**
  3. * 查询某些具体列,用Object[]数组接收
  4. * @param realName
  5. * @return
  6. */
  7. @Query(value = "select u.userId,u.userName,u.realName from User u where u.realName = :realName")
  8. public Object[] getUserByRealName2(@Param("realName") String realName);
  9. /**
  10. * 查询整个实体对象所有信息,可以直接用实体对象接收
  11. * @param realName
  12. * @return
  13. */
  14. @Query(value = "select u from User u where u.realName = :realName")
  15. public User getUserByRealName3(@Param("realName") String realName);
  16. /**
  17. * 返回List<Map>信息
  18. * @param realName
  19. * @return
  20. */
  21. @Query(value = "select new map(u as user) from User u where u.realName = :realName")
  22. public List<Map<String, Object>> getUserByRealName(@Param("realName") String realName);
  23. /**
  24. * 返回map对象
  25. * @param realName
  26. * @return
  27. */
  28. @Query(value = "select new map(u.realName as userName,o.orgName as orgName) from User u, Org o where u.realName = :realName")
  29. public Map<String, Object> getUserByRealName1(@Param("realName") String realName);
  30. }

测试的代码如下,完全没什么问题。

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(locations = {"classpath:conf/root-context.xml"})
  3. public class UserDaoTest {
  4. @Autowired
  5. private UserRepository userRepository;
  6. @Test
  7. public void test() {
  8. Object[] u2 = userRepository.getUserByRealName2("admin");
  9. User u3 = userRepository.getUserByRealName3("admin");
  10. List<Map<String, Object>> u = userRepository.getUserByRealName("test");
  11. String userName = ((User) u.get(0).get("user")).getRealName();
  12. System.out.println(userName);
  13. Map<String, Object> u1 = userRepository.getUserByRealName1("admin");
  14. String name = ((User) u1.get("userName")).getRealName();
  15. System.out.println(name);
  16. assert(userName.equals("admin"));
  17. }
  18. }

设置JPA的Query返回Map对象

说明正常执行jpa查询的时候需要传一个对应实体进行映射返回的数据,这样有时候如果一个sql是复合sql关联很多表,就需要新建实体有点麻烦,通过下面方式就能将返回结果映射成map。

这样就能随意获取返回结果的内容

  1. Query query = this.entityManager.createNativeQuery(sql);
  2. //设置JPA的Query返回Map对象
  3. query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).setParameter("createuser", userInfo.getUsercode()).setParameter("type", type);
  4. List<Map<String,String>> res = query.getResultList();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号