因为springDataJpa只能单表查询,引用queryDsl,可以多表查询,让你像写sql一样通过代码来完成查询。
school类:
@Entity
@Table(name = "school")
@Data
@ToString
public class School {
@Id
@GeneratedValue // 自动生成
private Long id;
private String name;
private Integer age;
private String title;
}
classAs类
@Entity
@Data
@Table(name = "class_as")
@ToString
public class ClassAs {
@Id
@GeneratedValue // 自动生成
private Long cid ;
private Long sid;
private String cname;
}
然后maven直接编译,就会出现Q开头的类
参数封装类1:DataDto
@Data
@ToString
public class DataDto {
private String name;
private String cname;
private OtherDto otherDto;
}
**参数封装类2:OtherDto **
@Data
public class OtherDto {
private String title;
private School school;
}
service
@Autowired
private JPAQueryFactory jpaQueryFactory;
/**
* 单表查询(其实用jpa就行但jpa只能单表,因此要使用querydsl多表)
* @return
*/
@Override
public List<School> query() {
QSchool school = QSchool.school;
// 像写sql一样写代码
return jpaQueryFactory.selectFrom(school)
.where(school.age.eq(12),school.name.like("%互联%"))
.fetch();
}
/**
* 多表联查
* @return
*/
@Override
public List<DataDto> moreQuery() {
QSchool school = QSchool.school;
QClassAs classAs = QClassAs.classAs;
List<DataDto> dataDtos = jpaQueryFactory.select(
// 查找的进行封装
Projections.fields(
DataDto.class,
school.name,
classAs.cname,
// 里面的属性
Projections.fields(
OtherDto.class,
school.title,
school
).as("otherDto") // 要指明那个字段 不用管otherDto = otherDto(),转json会正常
))
// 表及条件
.from(school).leftJoin(classAs).on(school.id.eq(classAs.sid))
.where(school.age.eq(12)).fetch();
return dataDtos;
}