Hibernate 在中使用CriteriaBuilder进行JPA查询
这是我第一次在这里发帖寻求帮助,如果这是一件非常愚蠢的事情,我很抱歉,但我已经尝试了一些我发现的代码,但它根本不起作用 在我们的应用程序中,我们使用单个字符串来过滤状态,但新的需求需要将其更改为列表。这里的限制是,我们试图使用旧方法实现向后兼容性,并使FE更容易与我们集成 我的问题是,是否可以使用criteriaBuilder.in()来使用列表过滤这些内容 在这里,我发布了我们BE中的规范Hibernate 在中使用CriteriaBuilder进行JPA查询,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,这是我第一次在这里发帖寻求帮助,如果这是一件非常愚蠢的事情,我很抱歉,但我已经尝试了一些我发现的代码,但它根本不起作用 在我们的应用程序中,我们使用单个字符串来过滤状态,但新的需求需要将其更改为列表。这里的限制是,我们试图使用旧方法实现向后兼容性,并使FE更容易与我们集成 我的问题是,是否可以使用criteriaBuilder.in()来使用列表过滤这些内容 在这里,我发布了我们BE中的规范 public Page<ReturnObject> findAll(final Pa
public Page<ReturnObject> findAll(final Pageable pageable, final GetRequest request) {
final Specification<ReturnObject> specification =
Specification.where(ReturnObjectSpecs.getFeNameSpec(request.getFeName())
.and(ReturnObjectSpecs.getIdSpec(request.getId()))
.and(ReturnObjectSpecs.getUserIdSpec(request.getUserId()))
.and(ReturnObjectSpecs.getStatusSpec(request.getStatus())));
return sessionRepository.findAll(specification, pageable);
}
publicpagefindall(最终可分页,最终获取请求){
最终规范=
规范.where(ReturnObjectSpecs.getFeNameSpec(request.getFeName())
.and(ReturnObjectSpecs.getIdSpec(request.getId()))
.and(ReturnObjectSpecs.getUserIdSpec(request.getUserId()))
和(ReturnObjectSpecs.getStatusSpec(request.getStatus());
返回sessionRepository.findAll(规范,可分页);
}
这里是criteriaBuilder的上一个规范
static Specification<ReturnObject> getStatusSpec(final String status){
return (root, query, criteriaBuilder) -> StringUtils.isEmpty(status)?
criteriaBuilder.isTrue(criteriaBuilder.literal(true)):
criteriaBuilder.equal(root.get("status"), status);
}
静态规范getStatusSpec(最终字符串状态){
return(root、query、criteriaBuilder)->StringUtils.isEmpty(状态)?
criteriaBuilder.isTrue(criteriaBuilder.literal(true)):
criteriaBuilder.equal(root.get(“status”)、status);
}
下面是我尝试用该列表进行查询的结果
static Specification<ReturnObject> getStatusSpec(final List<String> status) {
return (root, query, criteriaBuilder) -> {
if (status.isEmpty()) {
return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
} else {
Expression<String> expression = root.get("status");
expression.in(status);
return criteriaBuilder.in(expression);
}
};
}
静态规范getStatusSpec(最终列表状态){
返回(根、查询、准则生成器)->{
if(status.isEmpty()){
返回criteriaBuilder.isTrue(criteriaBuilder.literal(true));
}否则{
表达式=root.get(“状态”);
在(身份)中的表达;
返回criteriaBuilder.in(表达式);
}
};
}
这是我们的实际模型
public class GetRequest {
private Long id;
private Long userId;
private List<String> status;
//Getters and setters are ignored
}
public类GetRequest{
私人长id;
私有长用户ID;
私人名单状态;
//getter和setter被忽略
}
感谢您的帮助这应该可以正常工作:
返回root.get(“status”).in(status)
主题外
criteriaBuilder.isTrue(criteriaBuilder.literal(true))
可以替换为
criteriaBuilder.and()
依照
创建给定限制谓词的连接零谓词的连接为真。