spring data jpa 自定义复杂sql语句(多个select嵌套) 并返回自定义对象
2016-08-12 17:52
603 查看
摘要:利用自己写的sql语句从mysql数据库查询,并返回自定义的对象
提出问题:在springdatajpa中如何写原生态的sql语句,并返回自定义对象???
问题产生背景:学校学生为心目中的好老师vote,vote规则为,学生投2次,一次本系,一次外系。数据库中有两张表(teachers,students),由于考虑到各种原因,最后决定从学生表中查询每个老师所得总数。
数据库表的主要属性为:
teachers(id,real_name,department)
students(id,real_name,department,vote_for_internal,vote_for_external)
所采用框架为:springboot+springdatajpa+mysql+velocity
所遇困难:在解决这个问题的时候,我遇到几个问题:
1、sql语句很复杂(思路是:从students表查询vote_for_internal=teachers表的id,并且2表的系别要属于同一个系,这仅仅查出了学生所投本系老师,还有外系老师,最后还有老师所得总数)。
2、在用@query写了sql语句后,返回的结果集不能自动转换为自定义的对象。
最开始百度看到一篇博客,解决方案是直接在sql语句里实例化对象,我用了,但是语法错误,又谷歌了下,sql语句里是不能这样写的,这是hql的写法(sql是对数据库表查询,hql是对象的查询)
后来兜兜转转,又想使用hql去解决这个问题,但是hql是通过hibernate里的Session去执行的,但是springboot里获取Session又出现了问题,百度、谷歌里那些博客获取Session都不是使用springboot来的,最终没有找到解决方案。
最后,百度谷歌了几个小时,总算找到了解决方案。
解决问题:
代码如下:
@Service
publicclassStudentService{
@Autowired
privateStudentDaostudentDao;
@PersistenceContext
privateEntityManagerem;
publicList<VoteResult>getResult(){
Stringsql="SELECTi.*,e.external,i.internal+e.externalastotal\n"+
"FROM("+
"SELECTt.*,COUNT(*)ASinternalFROMstudentss,teacherst"+
"WHEREs.department=t.departmentANDs.vote_for_internal=t.idGROUPBYt.real_name\n"+
"ORDERBYCOUNT(*)DESC"+
")ASi,"+
"("+
"SELECTt.*,COUNT(*)ASexternalFROMstudentss,teacherst"+
"WHEREs.department!=t.departmentANDs.vote_for_external=t.idGROUPBYt.real_name\n"+
"ORDERBYCOUNT(*)DESC"+
")ASe\n"+
"WHEREi.real_name=e.real_nameORDERBYtotalDESC";
returnem.createNativeQuery(sql,VoteResult.class).getResultList();
}
}
遇到问题时,总觉得很难;解决问题时,总觉得简单。但是还是花了好几个小时解决问题,效率很低,但是同样也学习到了很多。这是我第一次写博客,开始学会总结问题,发现更多问题,加油!
提出问题:在springdatajpa中如何写原生态的sql语句,并返回自定义对象???
问题产生背景:学校学生为心目中的好老师vote,vote规则为,学生投2次,一次本系,一次外系。数据库中有两张表(teachers,students),由于考虑到各种原因,最后决定从学生表中查询每个老师所得总数。
数据库表的主要属性为:
teachers(id,real_name,department)
students(id,real_name,department,vote_for_internal,vote_for_external)
所采用框架为:springboot+springdatajpa+mysql+velocity
所遇困难:在解决这个问题的时候,我遇到几个问题:
1、sql语句很复杂(思路是:从students表查询vote_for_internal=teachers表的id,并且2表的系别要属于同一个系,这仅仅查出了学生所投本系老师,还有外系老师,最后还有老师所得总数)。
2、在用@query写了sql语句后,返回的结果集不能自动转换为自定义的对象。
最开始百度看到一篇博客,解决方案是直接在sql语句里实例化对象,我用了,但是语法错误,又谷歌了下,sql语句里是不能这样写的,这是hql的写法(sql是对数据库表查询,hql是对象的查询)
后来兜兜转转,又想使用hql去解决这个问题,但是hql是通过hibernate里的Session去执行的,但是springboot里获取Session又出现了问题,百度、谷歌里那些博客获取Session都不是使用springboot来的,最终没有找到解决方案。
最后,百度谷歌了几个小时,总算找到了解决方案。
解决问题:
代码如下:
遇到问题时,总觉得很难;解决问题时,总觉得简单。但是还是花了好几个小时解决问题,效率很低,但是同样也学习到了很多。这是我第一次写博客,开始学会总结问题,发现更多问题,加油!
相关文章推荐
- Spring data jpa 自定义SQL语句遇到错误Not supported for DML operations
- spring data jpa 关联查询返回自定义对象
- Spring Data Jpa 查询返回自定义对象
- Spring data jpa 自定义查询返回,用FastJson把Map转换为JavaBean
- Spring Data Jpa 使用@Query标注自定义查询语句
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- 通过spring-data-jpa进行复杂对象查询
- hibernate查询SQL语句返回自定义实体对象
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- hibernate查询SQL语句返回自定义实体对象
- Spring boot data JPA 自定义JPQL语句,以及PagingAndSortingRepository接口实现分页查询
- hibernate查询SQL语句返回自定义实体对象
- 通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句
- 【系统学习SpringBoot】再遇Spring Data JPA之JPA应用详解(自定义查询及复杂查询)
- Spring data jpa HQL @Query 自定义查询及更新删除 及 sql写法
- spring data jpa 自定义sql 左链接查询
- Spring Data JPA 复杂/多条件组合查询
- Spring技术内幕之Spring Data JPA-自定义Repository实现
- spring data jpa 利用JpaSpecificationExecutor做复杂查询