QueryDSL是一个通用的查询框架. 可以大大简化代码和不同数据库的sql差异化语法问题; 通过querydsl可以实现复杂的sql补充jpa的不足;
工程截图
1. 引入依赖
mongo依赖
org.springframework.boot spring-boot-starter-data-mongodb
querydsl依赖
com.querydsl querydsl-jpacom.querydsl querydsl-aptprovided
编译插件
com.mysema.maven apt-maven-pluginprocess target/generated-sources/java org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
完整的pom配置
2. yml配置文件4.0.0 org.springframework.boot spring-boot-starter-parent2.1.9.RELEASE com.demo demo-querydsl-mongo1.0-SNAPSHOT 1.8 1.2.83 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-data-mongodbcom.querydsl querydsl-jpa com.querydsl querydsl-aptprovided com.alibaba fastjson${fastjson.version} org.springframework.boot spring-boot-maven-plugincom.mysema.maven apt-maven-pluginprocess target/generated-sources/java org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
server: port: 8200 servlet: context-path: /demo spring: data: mongodb: host: 127.0.0.1:27017 username: root password: root database: demo authentication-database: admin3. 创建 实体对象
@Document对应关系型数据库中的@Entity; @CreatedDate需要再启动器类里面开启审计
@Document(collection = "demo_user")
public class User {
@Id
private String id;
@NotNull
@Size(min = 2, max = 20)
private String username;
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
private Date createdDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
private Date lastModifiedDate;
}
4. 创建Repository接口, 继承QuerydslPredicateExecutor接口, 方法都空着,继承就行了
@NoRepositoryBean public interface BaseMongoRepository5. 创建对象 repo, 继承BaseMongoRepository方法都空着,继承就行了. 需要传递范型extends MongoRepository , QuerydslPredicateExecutor { }
@Repository public interface UserRepository extends BaseMongoRepository6. 创建公共service{ }
提供公共的方法. 对象的service继承此类即可完成相关功能
public class BaseService7. 创建对象的service, 继承BaseService传递范型;{ @Autowired private BaseMongoRepository baseMongoRepository; public BaseMongoRepository getRepository() { return baseMongoRepository; } public List findAll() { return getRepository().findAll(); } public Iterable findAll(Predicate predicate) { if (null == predicate) { return findAll(); } return getRepository().findAll(predicate); } public Page findAll(Pageable pageable) { return getRepository().findAll(pageable); } public Page findAll(Predicate predicate, Pageable pageable) { if (null == predicate) { return findAll(pageable); } return getRepository().findAll(predicate, pageable); } public S save(S entity) { return getRepository().save(entity); } publicS update(S entity) { return getRepository().save(entity); } public T findById(I id) { Optionalone = getRepository().findById(id); if (one.isPresent()) { return one.get(); } return null; } public T findOne(Predicate predicate) { Optional one = getRepository().findOne(predicate); if (one.isPresent()) { return one.get(); } return null; } public long count() { return getRepository().count(); } public long count(Predicate predicate) { return getRepository().count(predicate); } public void delete(I id) { T entity = findById(id); delete(entity); } public void delete(T entity) { getRepository().delete(entity); } }
重写save方法. 使用querydsl 方法查询username是否重复; QUser 需要先编译才会自动生成
@Service public class UserService extends BaseService8. 编写controller进行测试{ @Override public S save(S entity) { BooleanBuilder builder = new BooleanBuilder(); builder.and(QUser.user.username.eq(entity.getUsername())); long count = count(builder); if (count > 1) { throw new RuntimeException("username 重复"); } return super.save(entity); } }
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/save")
public Object saveUser(@ModelAttribute @Valid User user, BindingResult bindingResult, HttpServletRequest request, HttpServletResponse response) {
if (bindingResult.hasErrors()) {
return bindingResult.getFieldError().getDefaultMessage();
}
userService.save(user);
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("data", user);
return jsonObject;
}
@RequestMapping(value = "/query")
public JSONObject queryUser(@QuerydslPredicate(root = User.class) Predicate predicate, @PageableDefault(size = 20, sort = {"createdDate"}, direction = Sort.Direction.DESC) Pageable pageable) {
Page userPage = userService.findAll(predicate, pageable);
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("data", userPage.getContent());
jsonObject.put("totalPages", userPage.getTotalPages());
jsonObject.put("totalElements", userPage.getTotalElements());
jsonObject.put("pageable", userPage.getPageable());
return jsonObject;
}
}
9. postman进行测试
保存接口. 通过@valid去检查合法性
查询接口; 通过
关注个人公众号获取源代码



