JPA:QueryCriteria where子句中的谓词和表达式

用户613114

我遇到一种情况,在我的where子句中,我只有一个谓词和表达式。两者都需要在where子句中进行AND运算:

Expression<String> col1 = tableEntity.get("col1");
Expression<String> regExpr = criteriaBuilder.literal("\\.\\d+$");
Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, col, regExpr);

Expression<TableEntity> col2= tableEntity.get("col2");
Predicate predicateNull = criteriaBuilder.isNull(col2);

createQuery.where(cb.and(predicateNull));
createQuery.where(regExprLike);

在这种情况下,我将无法执行以下操作:createQuery.where(predicateNull,regExprLike);

我尝试使用CriteriaBuilder的isTrue()方法:

Predicate predicateNull = criteriaBuilder.isNull(col2);
Predicate predicateTrue = criteriaBuilder.isTrue(regExprLike);
createQuery.where(predicateNull, predicateTrue);

但这没有帮助。

CriteriaQuery在where子句中允许谓词或表达式,但不能同时允许谓词或表达式。任何想法如何在QueryCriteria的where子句中同时使用谓词和表达式?

2014年10月10日更新: 根据克里斯的建议,我尝试使用:

createQuery.where(predicateNull, regExprLike);

但是我的查询失败,并带有异常:

Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected AST node: ( near line 1, column 311 [select coalesce(substring(generatedAlias0.col1,0,(locate(regexp_substr(generatedAlias0.col1, :param0),
generatedAlias0.col1)-1)), generatedAlias0.col1), generatedAlias0.col1 
from com.temp.TableEntity as generatedAlias0 
where (generatedAlias0.col2 is null ) and ( regexp_like(generatedAlias0.col1, :param1))] [Proxied because : Original exception not deserilizable, ClassNotFoundException]

我的代码如下:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> createQuery = criteriaBuilder.createQuery(Object[].class);

Root<TableEntity> tableEntity = createQuery.from(TableEntity.class);

Expression<String> path = tableEntity.get("col1");

Expression<String> regExpr = criteriaBuilder.literal("\\.\\d+$");
Expression<String> regExprSubStr = criteriaBuilder.function("regexp_substr", String.class, path, regExpr);

Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, path, regExpr);


Expression<Integer> l3 = criteriaBuilder.locate(path, regExprSubStr);
Expression<Integer> minusOne = criteriaBuilder.literal(1);
Expression<Integer> l3Sub1 = criteriaBuilder.diff(l3, minusOne);
Expression<Integer> zeroIndex = criteriaBuilder.literal(0);
Expression<String> s3 = criteriaBuilder.substring(path, zeroIndex, l3Sub1);

Expression<TableEntity> col1 = tableEntity.get("col1");
Expression<TableEntity> col2 = tableEntity.get("col2");

Expression<String> coalesceExpr = criteriaBuilder.coalesce(s3, path);
createQuery.multiselect(coalesceExpr, col1);

Predicate predicateNull = criteriaBuilder.isNull(col2);

createQuery.where(criteriaBuilder.and(predicateNull, regExprLike));
String query = entityManager.createQuery(createQuery).unwrap(org.hibernate.Query.class).getQueryString();
巴恩戈

我认为您的问题是oracle没有将'regexp_like'分类为一个函数。为了使其工作,您必须使用新的注册功能扩展Oracle方言:

 public class Oracle12cExtendedDialect extends Oracle12cDialect {

public Oracle12cExtendedDialect() {
    super();
    registerFunction(
            "regexp_like", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN,
                    "(case when (regexp_like(?1, ?2)) then 1 else 0 end)")
    );
}
}

然后您可以更改where子句:

        createQuery.where(criteriaBuilder.and(predicateNull, criteriaBuilder.equal(regExprLike, 1)));

当然,您必须在persistence.xml中注册新的方言。

            <property name="hibernate.dialect" value="path.to.your.dialect.class.Oracle12cExtendedDialect" />

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用JPA标准API将条件表达式与“ AND”和“ OR”谓词组合

来自分类Dev

LINQ表达式谓词添加where子句

来自分类Dev

JPA规范和.where子句中的null参数

来自分类Dev

查询优化-WHERE子句中的表达式顺序

来自分类Dev

在WHERE子句中带有参数的SSRS表达式

来自分类Dev

在where子句中的Postgres正则表达式

来自分类Dev

使用 Linq 在 WHERE 子句中构建 OR 表达式

来自分类Dev

where 子句中的 case 表达式包含多个值

来自分类Dev

如何在MySQL where和where子句中的语句中使用正则表达式

来自分类Dev

如何使用JPA QueryBuilder提供自定义表达式或谓词

来自分类Dev

LINQ表达式-动态的From和Where子句

来自分类Dev

使用表达式<Func <>>和<T>的Where子句

来自分类Dev

LINQ表达式-动态的From和Where子句

来自分类Dev

了解lambda表达式和/或谓词

来自分类Dev

如何在where子句中编写mysql正则表达式?

来自分类Dev

如何在Active Record where子句中正确转义正则表达式

来自分类Dev

实体框架6在带lambda表达式的where子句中使用父代

来自分类Dev

如何在Laravel中查询的WHERE子句中使用正则表达式?

来自分类Dev

如何在带有Join的EF Where()子句中使用表达式树?

来自分类Dev

存储库中实体框架中where子句中的复杂表达式

来自分类Dev

如何在Laravel中查询的WHERE子句中使用正则表达式?

来自分类Dev

WHERE子句中的CASE表达式选择不为NULL的行

来自分类Dev

在Where子句中使用Or和Select来比较带有int和lambda表达式的所有条目

来自分类Dev

Lambda表达式Where子句

来自分类Dev

Spring Data JPA-where子句中的许多列

来自分类Dev

JPA / HIBERNATE:如何在@where子句中传递值

来自分类Dev

JPA CriteriaBuilder-表达式<列表>

来自分类Dev

JPA @namedQuery,带有“ IN”表达式

来自分类Dev

JPA CriteriaBuilder-表达式<列表>

Related 相关文章

  1. 1

    使用JPA标准API将条件表达式与“ AND”和“ OR”谓词组合

  2. 2

    LINQ表达式谓词添加where子句

  3. 3

    JPA规范和.where子句中的null参数

  4. 4

    查询优化-WHERE子句中的表达式顺序

  5. 5

    在WHERE子句中带有参数的SSRS表达式

  6. 6

    在where子句中的Postgres正则表达式

  7. 7

    使用 Linq 在 WHERE 子句中构建 OR 表达式

  8. 8

    where 子句中的 case 表达式包含多个值

  9. 9

    如何在MySQL where和where子句中的语句中使用正则表达式

  10. 10

    如何使用JPA QueryBuilder提供自定义表达式或谓词

  11. 11

    LINQ表达式-动态的From和Where子句

  12. 12

    使用表达式<Func <>>和<T>的Where子句

  13. 13

    LINQ表达式-动态的From和Where子句

  14. 14

    了解lambda表达式和/或谓词

  15. 15

    如何在where子句中编写mysql正则表达式?

  16. 16

    如何在Active Record where子句中正确转义正则表达式

  17. 17

    实体框架6在带lambda表达式的where子句中使用父代

  18. 18

    如何在Laravel中查询的WHERE子句中使用正则表达式?

  19. 19

    如何在带有Join的EF Where()子句中使用表达式树?

  20. 20

    存储库中实体框架中where子句中的复杂表达式

  21. 21

    如何在Laravel中查询的WHERE子句中使用正则表达式?

  22. 22

    WHERE子句中的CASE表达式选择不为NULL的行

  23. 23

    在Where子句中使用Or和Select来比较带有int和lambda表达式的所有条目

  24. 24

    Lambda表达式Where子句

  25. 25

    Spring Data JPA-where子句中的许多列

  26. 26

    JPA / HIBERNATE:如何在@where子句中传递值

  27. 27

    JPA CriteriaBuilder-表达式<列表>

  28. 28

    JPA @namedQuery,带有“ IN”表达式

  29. 29

    JPA CriteriaBuilder-表达式<列表>

热门标签

归档