-
@Description 姓名
-
@Author LinLuoChen
-
@Date 10:44
**/
@Column(name = “name”)
private String name;
@Column(name = “password”)
private String password;
}
然后生成我们的 Q实体类,第一步点击右侧 Maven 然后选择第一个文件夹,双击 compile 它会自动运行,运行成功后会生成一个 QUser 的实体类 ,因为我们的实体类叫做 User 他是根据我们实体类来生成的
开始编写 Dao 层,引入JPA 的接口 – !!重要 !!!
package com.cs.querydsl.dao;
import com.cs.querydsl.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface UserDao extends JpaRepository
// -----
}
这里我们省略 Service 层 直接看 Impl 接口实现类,这里就先写一个单表查询进行测试
package com.cs.querydsl.service.impl;
import com.cs.querydsl.dao.UserDao;
import com.cs.querydsl.model.QUser;
import com.cs.querydsl.model.User;
import com.cs.querydsl.service.UserService;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Autowired
private EntityManager entityManager;
//查询工厂实体
private JPAQueryFactory queryFactory;
//实例化控制器完成后执行该方法实例化JPAQueryFactory
@PostConstruct
public void initFactory()
{
queryFactory = new JPAQueryFactory(entityManager);
}
@Override
public List findAll(User user) {
// 使用 QueryDSL 进行查询
QUser qUser = QUser.user;
// 定于获取条件
BooleanBuilder booleanBuilder = new BooleanBuilder();
// 要查询的条件
if(!StringUtils.isEmpty(user.getName())){
// 放入要查询的条件信息
booleanBuilder.and(qUser.name.contains(user.getName()));
}
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
// queryFactory 是上方定义的工厂实体
// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
return queryFactory.select(qUser)
.from(qUser)
.where(booleanBuilder)
.orderBy(qUser.name.desc())
.fetch();
}
}
我们直接写一个测试类进行测试
package com.cs.querydsl;
import com.cs.querydsl.model.User;
import com.cs.querydsl.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class QuerydslApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
}
@Test
public void QueryDSLTest(){
User user = new User();
List list = userService.findAll(user);
System.out.println(list);
}
}
测试结果,可以运行 ~~
虽然说 QueryDSL 也可以做增删改查,但是个人不建议使用(仅限单表),因为单表操作,其实使用 Jpa 就可以了,包括 Jpa 的动态查询,都是很适合单表的,不管是代码量还是效率个人感觉都比 QueryDSL 要快,尤其是代码量,少了不止一点半点,但是连表操作的话,就比较偏向于 QueryDSL 了,特别好用!!下边是连表操作的 QueryDSL ,另外说一下上边只是演示一下 QueryDSL 的使用方法,单表还是建议用 Jpa 比较快!
---------------------------------------------------- 手动分界线 ----------------------------------------------------
package com.cs.querydsl.service.impl;
import com.cs.querydsl.dao.LocDao;
import com.cs.querydsl.model.Loc;
import com.cs.querydsl.model.QLoc;
import com.cs.querydsl.model.QUser;
import com.cs.querydsl.service.LocService;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.QueryResults;
import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class LocServiceImpl implements LocService {
@Autowired
LocDao locDao;
@Autowired
private EntityManager entityManager;
//查询工厂实体
private JPAQueryFactory queryFactory;
//实例化控制器完成后执行该方法实例化JPAQueryFactory
@PostConstruct
public void initFactory()
{
queryFactory = new JPAQueryFactory(entityManager);
}
@Override
public List findAll(Loc loc) {
// 使用 QueryDSL 进行查询
QLoc qLoc = QLoc.loc1;
QUser qUser = QUser.user;
// 定于获取条件
BooleanBuilder booleanBuilder = new BooleanBuilder();
// 要查询的条件
if(!StringUtils.isEmpty(loc.getLoc())){
// 放入要查询的条件信息
booleanBuilder.and(qLoc.loc.contains(loc.getLoc()));
}
//连接查询条件(Loc.id = User.id )
booleanBuilder.and(qLoc.id.eq(qUser.id));
// 使用 QueryDSL 进行多表联合查询
QueryResults listResult = queryFactory
.select(QLoc.loc1,QUser.user)
.from(qLoc, qUser)//查询两表
.where(booleanBuilder)
.fetchResults();
//遍历 java8 自带流转换成集合



