自定义返回的字段,不知道为啥select new 总是报错,无论是select new Map 还是select new 实体,所以先暂时用下边这个不规范的方法,等我找出原因了会更新
自定义实体,继上边那个问题后发现自定义实体的话可以实现,首先要加@Entity注解和@Id注解
实体,省略setter和getter
sql:
这里用了一个工具类,封装的就是entitymanager的方法:
测试:
解决办法二:不知道百度上那些select new是怎么操作的,反正我操作结果集总是不对,但是还是找到了另一种解决方法:
在dao层中的代码,这里的query注解执行sql代码返回的是一个list,也就是这个:List<Object[]> list = entityManager.createNativeQuery(sql).getResultList();
里边的元素是object[]数组,这里相当于强转一下由Object[]转化为Map<String,Object>
建议的话还是用对象来接受,因为对象接收的话就相当于mybatis的resultMap,如果元素为空的话是会显示的,但是用map接受的话空元素就不会显示。
测试:
解决办法三:终于找到了select new 的办法:
首先还是建自定义实体类Test,注意参数类型必须和原类的参数类型相同,且构造方法内的参数顺序和查询的顺序一致,相应的注解也要加:
然后在responsitory中,new Test内的参数与构造方法中的顺序一致,这是hql的写法所以nativeQuery=true这个启用sql语句的参数就不需要了,赋值的话在这里用:id,@Param这个注解也不能少,from表的时候要找对应的实体类而不是数据库中的表名。
解决办法四:不用另外创建实体类,返回List<Map<String,Object>>的数据: