文档章节

spring data jpa 自定义复杂sql语句(多个select嵌套) 并返回自定义对象

zcyzzz
 zcyzzz
发布于 2016/06/04 17:24
字数 644
阅读 1792
收藏 1

 提出问题: 在spring data jpa 中如何写 原生态的sql语句,并返回自定义对象???

     

         问题产生背景:学校学生为心目中的好老师vote,vote规则为,学生投2次,一次本系,一次外系。数据库中有两张表(teachers,students),由于考虑到各种原因,最后决定从学生表中查询每个老师所得总数。

        数据库表的主要属性为:

            teachers(id,real_name,department)

            students(id,real_name,department,vote_for_internal,vote_for_external)

        所采用框架为:spring boot+spring data jpa+mysql+velocity

    

  所遇困难: 在解决这个问题的时候,我遇到几个问题:

       1、sql语句很复杂(思路是:从students表查询vote_for_internal=teachers表的id,并且2表的系别要属于同一个系,这仅仅查出了学生所投本系老师,还有外系老师,最后还有老师所得总数) 。

      2、在用@query写了sql语句后,返回的结果集不能自动转换为自定义的对象。

        最开始百度看到一篇博客,解决方案是直接在sql语句里实例化对象,我用了,但是语法错误,又谷歌了下,sql语句里是不能这样写的,这是hql的写法(sql是对数据库表查询,hql是对象的查询)

      后来兜兜转转,又想使用hql去解决这个问题,但是hql是通过hibernate里的Session去执行的,但是spring boot 里获取Session又出现了问题,百度、谷歌里那些博客获取Session都不是使用spring boot 来的,最终没有找到解决方案。

  

   最后,百度谷歌了几个小时,总算找到了解决方案。

解决问题:

   代码如下:

@Service
public class StudentService {

    @Autowired
    private StudentDao studentDao;

    @PersistenceContext
    private EntityManager em;

    public List<VoteResult> getResult(){

        String sql="SELECT i.*,e.external,i.internal+e.external as total\n" +
                "FROM(" +
                "SELECT t.*,COUNT(*) AS internal FROM students s,teachers t" +
                " WHERE s.department=t.department AND s.vote_for_internal=t.id GROUP BY t.real_name\n" +
                "ORDER BY COUNT(*) DESC" +
                ")AS i," +
                "(" +
                "SELECT t.*,COUNT(*) AS external FROM students s,teachers t " +
                "WHERE s.department!=t.department AND s.vote_for_external=t.id GROUP BY t.real_name\n" +
                "ORDER BY COUNT(*) DESC" +
                ")AS e\n" +
                "WHERE i.real_name=e.real_name ORDER BY total DESC";


        return em.createNativeQuery(sql,VoteResult.class).getResultList();

    }
}

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

 

 

© 著作权归作者所有

zcyzzz
粉丝 2
博文 2
码字总数 866
作品 0
成都
私信 提问
加载中

评论(2)

帅骚贯彻一生
帅骚贯彻一生
可以的!
Alex_Nine
Alex_Nine
可以 这很强势
(入门帖)使用 Spring Data JPA 简化 JPA 开发

本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例;接着重构该示例,并引入 Spring 框架,这两部分...

阿莱倪士
2014/01/09
727
0
使用 Spring Data JPA 简化 JPA 开发

从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例;接着重构该示例,并...

IBMdW
2012/03/02
4.5K
8
Spring Boot [组件学习-Spring Data JPA]

导读: 在上篇文章中对Spring MVC常用的一些注解做了简要的说明,在这篇文章中主要对Spring Data JPA 做一个简要的说明,并附有一个简单的例子,可以体会到Spring Data JPA 的强大之处。 Sp...

yangrd
2018/08/27
0
0
SpringBoot | 第三十章:Spring-data-jpa的集成和使用

前言 在前面的第九章:Mybatis-plus的集成和使用章节中,介绍了使用框架进行数据库的访问。今天,我们来简单学习下如何使用进行数据库的访问。由于本人未使用过,也是趁着写博文的机会查阅了...

oKong
2018/10/31
311
0
【转载】纯干货,Spring-data-jpa(spring数据持久层解决规范)详解,全方位介绍。

本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现...

ZhangLG
2019/04/16
148
0

没有更多内容

加载失败,请刷新页面

加载更多

ZhaoWei-2020-01-18

Redis官方文档 简介 Redis是开源的(BSD许可)内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如 字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半...

SuSheePark
30分钟前
11
0
替换字符串C#中的换行符

如何在C#中替换字符串中的换行符? #1楼 由于新行可以用\\n , \\r和\\r\\n分隔,因此我们首先将\\r和\\r\\n替换为\\n ,然后才拆分数据字符串。 以下几行应转到parseCSV方法: function p...

javail
32分钟前
10
0
快递物流上门取件api接口对接指南(中通圆通申通韵达百世)

1.常用快递API 支持顺丰、EMS、申通、圆通、韵达、汇通、中通、天天、德邦、全峰等主流快递公司。 上门取件,是电商平台为寄件用户提供的通过一键下单到快递员,并在2小时上门取件的寄件服务...

程序的小猿
36分钟前
6
0
WebFlux系列(十一)WebClient 日志

#Java#Spring#WebClient#WebFlux#log#日志# WebClient 日志 视频讲解 : https://www.bilibili.com/video/av83627944/ WebfluxConsumerApplication.java package com.example.webfluxconsumer......

潘文海
39分钟前
6
0
使用LINQ来获取一个List <>中的项目,而不是另一个List <>中的项目

我会假设有一个简单的LINQ查询可以做到这一点,但我不确定该如何做。 给出这段代码: class Program{ static void Main(string[] args) { List<Person> peopleList1 = new...

技术盛宴
47分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部