基於spring data jpa @query返回map的踩坑記錄
spring data jpa @query返回map踩坑記錄
最近用spring data jpa,網上看的一些教程,有的說是返回的Object[]數組,有的說是直接返回的對象,親身驗證瞭一下,發現主要看寫法和返回結果。
用的版本是這樣的:
dao代碼如下:
public interface UserRepository extends JpaRepository<User, Integer> { /** * 查詢某些具體列,用Object[]數組接收 * @param realName * @return */ @Query(value = "select u.userId,u.userName,u.realName from User u where u.realName = :realName") public Object[] getUserByRealName2(@Param("realName") String realName); /** * 查詢整個實體對象所有信息,可以直接用實體對象接收 * @param realName * @return */ @Query(value = "select u from User u where u.realName = :realName") public User getUserByRealName3(@Param("realName") String realName); /** * 返回List<Map>信息 * @param realName * @return */ @Query(value = "select new map(u as user) from User u where u.realName = :realName") public List<Map<String, Object>> getUserByRealName(@Param("realName") String realName); /** * 返回map對象 * @param realName * @return */ @Query(value = "select new map(u.realName as userName,o.orgName as orgName) from User u, Org o where u.realName = :realName") public Map<String, Object> getUserByRealName1(@Param("realName") String realName); }
測試的代碼如下,完全沒什麼問題。
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:conf/root-context.xml"}) public class UserDaoTest { @Autowired private UserRepository userRepository; @Test public void test() { Object[] u2 = userRepository.getUserByRealName2("admin"); User u3 = userRepository.getUserByRealName3("admin"); List<Map<String, Object>> u = userRepository.getUserByRealName("test"); String userName = ((User) u.get(0).get("user")).getRealName(); System.out.println(userName); Map<String, Object> u1 = userRepository.getUserByRealName1("admin"); String name = ((User) u1.get("userName")).getRealName(); System.out.println(name); assert(userName.equals("admin")); } }
設置JPA的Query返回Map對象
說明正常執行jpa查詢的時候需要傳一個對應實體進行映射返回的數據,這樣有時候如果一個sql是復合sql關聯很多表,就需要新建實體有點麻煩,通過下面方式就能將返回結果映射成map。
這樣就能隨意獲取返回結果的內容
Query query = this.entityManager.createNativeQuery(sql); //設置JPA的Query返回Map對象 query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).setParameter("createuser", userInfo.getUsercode()).setParameter("type", type); List<Map<String,String>> res = query.getResultList();
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springboot jpa之返回表中部分字段的處理詳解
- springdata jpa使用Example快速實現動態查詢功能
- spring boot中nativeQuery的用法
- 利用SpringDataJPA開啟審計功能,自動保存操作人操作時間
- SpringData如何通過@Query註解支持JPA語句和原生SQL語句