栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot + MySQL+ JPA Ⅶ querydsl使用方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot + MySQL+ JPA Ⅶ querydsl使用方法

一、pom.xml 1、添加依赖(版本号4.1会导致报错,使用4.4.0之后解决)

	com.querydsl
	querydsl-apt
	4.4.0



	com.querydsl
	querydsl-jpa
	4.4.0
2、添加脚本(用来生产Q文件的)

	com.mysema.maven
	apt-maven-plugin
	1.1.3
	
		
			
				process
			
			
				target/generated-sources/java
				com.querydsl.apt.jpa.JPAAnnotationProcessor
			
		
	

实体类写完后需要点击maven下面的compile来生成Q类文件

二、select单表 User类
@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer age;

    @ManyToOne  //user对work是多对一
    @JoinColumn(name="work_id")  //所对应的数据库的列是work_id
    private Work work;

}
Work类
@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class Work {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
}
service
@Service
public class DslService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private EntityManager entityManager;

    private JPAQueryFactory jpaQueryFactory;

	//项目启动后就执行
    @PostConstruct
    public void initFactory()
    {
        jpaQueryFactory = new JPAQueryFactory(entityManager);
    }


    public List getAll(){
		
        QUser qUser = QUser.user;
        QWork qWork = QWork.work;
		
        // queryFactory 是上方定义的工厂实体
        // select(生成的实体类的字段).from(生成实体类的名称).on(上方要查询的条件).orderBy(排序).fetch()进行查询
        Predicate predicate = qUser.work.id.eq(qWork.id);
        JPAQuery jpaQuery = jpaQueryFactory.select(qUser).from(qUser)
                .leftJoin(qWork)
                .on(predicate)
                .orderBy(qUser.name.desc());
        List list = jpaQuery.fetch();

        return list;
    }
}
control
@RestController
public class UserControl {
	
	@Autowired
    private DslService dslService;
	
	@GetMapping("/getAll")
    public List getAll(){
        return dslService.getAll();
    }
	
}
三、多表返回的是Tuple,tuple.get(index,实体类.class)或者是tuple.get(q实体类)
public List getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	JPAQuery jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.orderBy(qUser.name.desc());
	List list = jpaQuery.fetch();
	List users = new ArrayList<>();
	list.forEach( (tuple) -> {
		String name = tuple.get(qUser).getName();  //tuple.get(0,User.class).getName()效果一样
		Integer age = tuple.get(qUser).getAge();
		Integer id = tuple.get(qUser).getId();
		Work work = tuple.get(qUser).getWork();
		User user = new User();
		user.setId(id);
		user.setName(name);
		user.setAge(age);
		user.setWork(work);
		users.add(user);
	});

	return users;
}
四、分页查询
public List getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	Pageable pageable = PageRequest.of(1,5); //第二页,页面大小为5(可以由入参决定)
	JPAQuery jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.orderBy(qUser.name.desc());
	List list = jpaQuery.fetch();
	List users = new ArrayList<>();
	list.forEach((tuple)->{
		String name = tuple.get(qUser).getName();
		Integer age = tuple.get(qUser).getAge();
		Integer id = tuple.get(qUser).getId();
		Work work = tuple.get(qUser).getWork();
		User user = new User();
		user.setId(id);
		user.setName(name);
		user.setAge(age);
		user.setWork(work);
		users.add(user);
	});

	return users;
}
附加: 获取的tuple类型可以通过流转换成集合(java8的特性)
public List getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	Pageable pageable = PageRequest.of(1,5);
	JPAQuery jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.orderBy(qUser.name.desc());
	List list = jpaQuery.fetch();
	//遍历 java8 自带流转换成集合
	List collect = list.stream().map(tuple -> {
		User user = tuple.get(qUser);
		return user;
	}).collect(Collectors.toList());
	return collect;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号