Java程序员如何使用spring data JPA完成分组查询?答案看这里!

在BOS2.0课程学习spring data JPA的时候,已经对复杂的多表多条件联合查询进行讲解,对于分组的操作,spring data JPA中并没有提供直接的API去实现,下面制作一个测试demo,以“曲线救国”的方式进行分组查询。

Java程序员如何使用spring data JPA完成分组查询?答案看这里!

 

编辑

请点击输入图片描述

完成的需求:查询辽宁省下的所有市以及其编码前四位(比如2101)

1. 准备数据(表t_area数据省份为辽宁省):

Java程序员如何使用spring data JPA完成分组查询?答案看这里!

 

编辑

请点击输入图片描述

在数据库中,辽宁省的邮政编码前两位是21,下属14个市级单位。

2. 可以预先写出原生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前四位进行分组

查询结果如下:

Java程序员如何使用spring data JPA完成分组查询?答案看这里!

 

编辑

请点击输入图片描述

3.利用JPA的配置(这里就不贴出了),编写DAO接口,继承JpaRepository

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接收查询结果

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;

}

}

需要注意的是

Java程序员如何使用spring data JPA完成分组查询?答案看这里!

 

编辑

请点击输入图片描述

5.准备测试类测试代码

注入dao

@Autowired

private AreaDao areaDao;

编写测试方法,传入查询条件 21(辽宁省id前两位)并debug运行

@Test

@Transactional

public void test6() {

List<CityArea> areas = areaDao.getCityByProId("21");

System.out.println(areas);

}

debug可以看到结果数据

Java程序员如何使用spring data JPA完成分组查询?答案看这里!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值