Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带Querydsl的JPA谓词_Jpa_Spring Data Jpa_Querydsl - Fatal编程技术网

带Querydsl的JPA谓词

带Querydsl的JPA谓词,jpa,spring-data-jpa,querydsl,Jpa,Spring Data Jpa,Querydsl,我在应用程序中使用Querydsl极大地改进了查询数据库的代码。 但是,我有一个来自外部服务的JPA谓词(javax.persistence.criteria.Predicate)。 我想混合使用Querydsl和外部谓词创建的查询。例如: //来自外部服务的JPA谓词 根=。。。; 准则生成器cb=。。。; javax.persistence.criteria.Predicate externalPredicate=externalService.filterEmail(root,cb,“%@

我在应用程序中使用Querydsl极大地改进了查询数据库的代码。 但是,我有一个来自外部服务的JPA谓词(javax.persistence.criteria.Predicate)。 我想混合使用Querydsl和外部谓词创建的查询。例如:

//来自外部服务的JPA谓词
根=。。。;
准则生成器cb=。。。;
javax.persistence.criteria.Predicate externalPredicate=externalService.filterEmail(root,cb,“%@gmail.com”);
//创建Querydsl谓词
布尔表达式querydslExp=QUser.username.eq(“foo”);
//混合谓词(这是我需要的)
querydslExp.and(externalPredicate);
另一种解决方案可能是将Querydsl谓词转换为JPA谓词:

cb.and(querydslExp.toJpaPredicate(),externalPredicate);
可能吗? 如果是,我如何才能做到这一点? 如果否,是否有另一种混合谓词的解决方案(如将两者转换为SQL字符串并创建新查询)


感谢

使用QueryDSL表达式
访问者
返回JPA标准
表达式
,并使用
CriteriaBuilder
CriteriaQuery
作为上下文,这是非常可能的:

CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery();
javax.persistence.criteria.Expression结果=Expression.accept(新访问者访问(常量expr,CriteriaBuilder上下文){
返回context.literal(expr.getConstant());
}
@凌驾
public javax.persistence.criteria.Expression访问(FactoryExpression,CriteriaBuilder上下文){
抛出新的UnsupportedOperationException();
}
@凌驾
public javax.persistence.criteria.Expression访问(操作expr,CriteriaBuilder上下文){
javax.persistence.criteria.Expression[]参数=新的javax.persistence.criteria.Expression[expr.getArgs().size()];
对于(int i=0;ir.getAlias().equals(expr.getMetadata().getName()).findAny().get();
}
//获取父路径
javax.persistence.criteria.Path parent=(javax.persistence.criteria.Path)expr.getMetadata().getParent().accept(这个,上下文);
返回parent.get(expr.getMetadata().getName());
}
@凌驾
public javax.persistence.criteria.Expression访问(SubQueryExpression expr,CriteriaBuilder上下文){
//辩护可能
抛出新的UnsupportedOperationException();
}
@凌驾
public javax.persistence.criteria.Expression访问(TemplateExpression,CriteriaBuilder上下文){
//不存在真正的JPA等价物。特别是存在可能性。
抛出新的UnsupportedOperationException();
}
},标准生成器);

要混合使用两种完全不同的API吗?据我所知,我不能这么做,原因很明显。。。它们是可选的。我对querydsl sql有疑问,但找不到解决方案。如果你看,我会很高兴的