本帖最后由 小鲁哥哥 于 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可以看到结果数据
|