A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2020-1-8 18:57 编辑


     在BOS2.0课程学习spring data JPA的时候,已经对复杂的多表多条件联合查询进行讲解,对于分组的操作,spring data JPA中并没有提供直接的API去实现,下面制作一个测试demo,以“曲线救国”的方式进行分组查询。
    完成的需求:查询辽宁省下的所有市以及其编码前四位(比如2101)
    1. 准备数据(表t_area数据省份为辽宁省):
   
    在数据库中,辽宁省的邮政编码前两位是21,下属14个市级单位。
    2. 可以预先写出原生SQL:
   
[SQL] 纯文本查看 复制代码
select substr(c_id,0,4),c_city 
from t_area 
where substr(c_id,0,2) = '21' --按照c_id前两位是21(即辽宁省)过滤市
group by c_city,substr(c_id,0,4) -- 按照城市名称、c_id前四位进行分组

    查询结果如下:
   
    3.利用JPA的配置(这里就不贴出了),编写DAO接口,继承JpaRepository
   
[Java] 纯文本查看 复制代码
public interface AreaDao extends JpaRepository<Area, String>{

        @Query(value="select new cn.itcast.bos.domain.base.CityArea(substr(a.id,0,4),a.city)"
                        + " from Area a"
                        + " where substr(a.id,0,2) = ?"
                        + " group by substr(a.id,0,4),a.city")
        List<CityArea> getCityByProId(String string);
}

    需要特别说明,由于该查询结果只接收两个字段,无法直接会用T_AREA表对应的JavaBean来接收响应数据,需要额外提供一个普通类(CityArea)接收
    4. 准备CityArea接收查询结果
   
[Java] 纯文本查看 复制代码
public class CityArea {
        private String id;
        private String cityName;
        public String getId() {
                return id;
        }
        public void setId(String id) {
                this.id = id;
        }
        public String getCityName() {
                return cityName;
        }
        public void setCityName(String cityName) {
                this.cityName = cityName;
        }
        public CityArea() {
        }
        //特别说明:
        //该有参构造必须有,因为需要对应接收查询语句中
        //select new cn.itcast.bos.domain.base.CityArea(substr(a.id,0,4),a.city)
        //所new出来的对象的两个参数
        public CityArea(String id, String cityName) {
                this.id = id;
                this.cityName = cityName;
        }
}

    需要注意的是

    5.准备测试类测试代码
    注入dao
   
[Java] 纯文本查看 复制代码
@Autowired
        private AreaDao        areaDao;

    编写测试方法,传入查询条件 21(辽宁省id前两位)并debug运行
   
[Java] 纯文本查看 复制代码
@Test
        @Transactional
        public void test6() {
                List<CityArea> areas = areaDao.getCityByProId("21");
                System.out.println(areas);
        }

debug可以看到结果数据

   


4 个回复

倒序浏览
最近springData确实挺火,好几个同学的公司都在用这个~,受益匪浅
回复 使用道具 举报
springcome
回复 使用道具 举报
spring data jpa 本来就是为了方便开发而推出来的一份标准的api,其命名规范,就是为了使用 方法的定义,来免去写sql 语句的 这一步,而你这样先写sql ,再利用注解来取巧,这本身就是在逃避jpa带来的强大的功能。虽然可以实现,但是如果你有100个复杂查询的方法 100个方法都要写sql语句吗,这很不现实,如果是这样,还不如用mybatis。我只能说,你对jpa 的多表复杂条件查询 还没有完全理解,  而且我觉得你这种写法  真的很low
回复 使用道具 举报
受益匪浅 已收藏
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马