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

目录
  • spring data jpa @query返回map踩坑记录
  • 设置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();

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

(0)

相关推荐

  • 详解Spring的StringUtils踩坑记录

    起因 最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题. 原VO关键代码如下: public class PageVo implements Serializable{ // ...省略所有无关代码 Map<String, String> query } 这个VO是用于从前端分页查询时传参,而query是用于传递查询条件的(这里不讨论用Map传参是否合理).当前端无查询条件时则会导致query为null,如果不注意容易出现NPE

  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    目录 Spring data jpa @Query 使用原生Sql的坑 根据代码来解说: 需要注意的方法有以下几点 SpringData JPA @Query动态SQL语句 思路 实现 Spring data jpa @Query 使用原生Sql的坑 根据代码来解说: @Query(value = "select bill.id_ as id, bill.created_date as date, bill.no, lawyer_case .case_no as caseNo, " +

  • 让JPA的Query查询接口返回Map对象的方法

    在JPA 2.0 中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句. 但当我们查询结果没有对应实体类时,query.getResultList()返回的是一个List<Object[]>.也就是说每行的数据被作为一个对象数组返回. 常见的用法是这样的: public void testNativeQuery(){ Query query = entityManager.createNativeQuery("select id, n

  • 使用Spring Data Jpa的CriteriaQuery一个陷阱

    使用Spring Data Jpa的CriteriaQuery进行动态条件查询时,可能会遇到一个陷阱,当条件为空时,查询不到任何结果,并不是期望的返回所有结果.这是为什么呢? 例如下述代码,当predicates为空时,返回结果总是为空. public Page<VmhostWithRelationPO> listVmhostSpecWithRelationByPage(String name) { Specification<VmhostWithRelationPO> spec

  • 基于spring data jpa @query返回map的踩坑记录

    目录 spring data jpa @query返回map踩坑记录 设置JPA的Query返回Map对象 spring data jpa @query返回map踩坑记录 最近用spring data jpa,网上看的一些教程,有的说是返回的Object[]数组,有的说是直接返回的对象,亲身验证了一下,发现主要看写法和返回结果. 用的版本是这样的: dao代码如下: public interface UserRepository extends JpaRepository<User, Integ

  • spring data jpa @Query注解中delete语句报错的解决

    目录 spring data jpa @Query注解中delete语句报错 项目中需要删除掉表中的一些数据 JPA使用@Query注解实例 1. 一个使用@Query注解的简单例子 2. Like表达式 3. 使用Native SQL Query 4. 使用@Param注解注入参数 5. SPEL表达式(使用时请参考最后的补充说明) 6. 一个较完整的例子 7. S模糊查询注意问题 8. 解释例6中错误的原因 spring data jpa @Query注解中delete语句报错 项目中需要删

  • Spring data jpa @Query update的坑及解决

    目录 Springdatajpa@Queryupdate的坑 可以参考这个例子 Springdatajpa的update操作 1.调用保存实体的方法 2.@Query注解,自己写JPQL语句 Spring data jpa @Query update的坑 jpa默认只有save(Entity)方法,如果数据库中没有记录就新增,如果数据库中有记录就更新记录. 如果要手动添加update(Entity)方法, 可以参考这个例子  @Modifying  @Query(value = "UPDATE

  • Spring Boot统一返回体的踩坑记录

    前言 在Spring Boot项目中我们可以通过RestControllerAdvice配合实现ResponseBodyAdvice<T>接口来保证Spring MVC接口具有统一的返回格式,以保证前端同学能够封装统一的数据接收工具.但是很多网上的文章并没有对实际开发中的细节作出更多的讲解.今天胖哥就来分享一下我的采坑经历,也算作一个总结. 控制作用范围 我记得在前面关于Swagger3的文章中提过,如果我们不指定范围将导致Swagger无法识别接口的元信息.因此如果你使用了Swagger必须

  • Spring Data JPA使用JPQL与原生SQL进行查询的操作

    1.使用JPQL语句进行查询 JPQL语言(Java Persistence Query Language)是一种和SQL非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的SQL语言,从而屏蔽不同数据库的差异. JPQL语言通过Query接口封装执行,Query 接口封装了执行数据库查询的相关方法.调用 EntityManager 的 Query.NamedQuery 及 NativeQuery 方法可以获得查询对象,进而可调用Query接口的相关方法来执行查询操作. JPQ

  • Spring DATA JPA 中findAll 进行OrderBy方式

    目录 Spring DATA JPA 中findAll 进行OrderBy Spring Data JPA使用orderby的一个小坑 Spring DATA JPA 中findAll 进行OrderBy 需要在 repository 中 定义这样的方法 :findAllByOrderByUpdatedAtDesc() public List findAllByOrderByUpdatedAtDesc(); 重要:(中间要多加一个By) findAllByOrderByUpdatedAtDesc

  • Spring Data JPA实现查询结果返回map或自定义的实体类

    目录 Spring Data JPA查询结果返回map或自定义的实体类 1.工具类 2.具体应用 spingboot:jpa:Spring data jpa 返回map 结果集 Spring Data JPA查询结果返回map或自定义的实体类 在JPA中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句,并且JPA的底层实现都是支持返回Map对象的. 例如: EclipseLink 的 query.setHint(QueryHints.RESUL

  • Spring Data JPA实现查询结果返回map或自定义的实体类

    目录 SpringDataJPA查询结果返回map或自定义的实体类 1.工具类 2.具体应用 spingboot:jpa:Springdatajpa返回map结果集 Spring Data JPA查询结果返回map或自定义的实体类 在JPA中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句,并且JPA的底层实现都是支持返回Map对象的. 例如: EclipseLink 的 query.setHint(QueryHints.RESULT_TYPE

  • Spring Data Jpa返回自定义对象的3种方法实例

    目录 方法一.简单查询直接new对象 方法二.Service层使用EntityManager 方法三.Dao层使用Map接收自定义对象 总结 tasks表对应的Entity @Entity @NoArgsConstructor @AllArgsConstructor @Table(name = "tasks") @Data public class Tasks extends BaseEntity { @Id @GeneratedValue(strategy = GenerationT

随机推荐