您的位置:首页 > 编程语言 > Java开发

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(); } }
遇到问题时,总觉得很难;解决问题时,总觉得简单。但是还是花了好几个小时解决问题,效率很低,但是同样也学习到了很多。这是我第一次写博客,开始学会总结问题,发现更多问题,加油!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息