【问题标题】:EclipseLink REGEXP?EclipseLink 正则表达式?
【发布时间】:2013-11-04 08:41:27
【问题描述】:

我必须根据列值上的正则表达式从数据库中搜索记录。我正在使用 JPA 进行持久化,并且 JPA 中不支持 REGEXP,我在 Google 上搜索并知道 EclipseLink 支持 REGEXP,我知道这是对可移植性的妥协,但我没有任何出路。

我想询问以下关于 EclipseLink REGEXP 支持的问题 -

  1. 如何使用 EclipseLink 支持的 REGEXP
  2. 在什么情况下保证对 REGEXP 的支持
  3. 如果不能保证失败时的行为是什么

提前致谢

【问题讨论】:

    标签: regex database jpa eclipselink


    【解决方案1】:

    美好的一天。您也可以使用 CriteriaBuilder api。 这是您将搜索很长时间的解决方案:)

      CriteriaBuilder cb = entityManager.getCriteriaBuilder();
      CriteriaQuery<?> query = cb.createQuery(...);
      Root root = query.from(...);
    
      List<Predicate> predicates = new ArrayList<Predicate>();
    
      // https://www.eclipse.org/forums/index.php/t/831290/
      if (cb instanceof org.eclipse.persistence.jpa.JpaCriteriaBuilder) {
        org.eclipse.persistence.jpa.JpaCriteriaBuilder ecb = (org.eclipse.persistence.jpa.JpaCriteriaBuilder) cb;
        org.eclipse.persistence.expressions.Expression exp = ecb.toExpression(root.get("field")).regexp("some regexp expression");
    
        List<Expression<?>> parentExps = Collections.emptyList();
        Predicate regExp = new org.eclipse.persistence.internal.jpa.querydef.PredicateImpl(entityManager.getMetamodel(), exp, parentExps, Predicate.BooleanOperator.AND);
        predicates.add(regExp);
      }
      else { ... some other solution }
    
      query.where(predicates.toArray(new Predicate[predicates.size()]));
    

    【讨论】:

      【解决方案2】:

      表达式的 EclipseLink 文档可在此处找到: http://www.eclipse.org/eclipselink/api/2.4/org/eclipse/persistence/expressions/Expression.html#regexp(java.lang.String)

      您可以查看博文http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html 其中列出了一些支持 REGEXP 的数据库,但归结为数据库。 EclipseLink 将发出 SQL,由数据库来处理和控制行为。如果不能,它可能会抛出异常,说明 SQL 中存在错误。有关 REGEXP 工作原理的详细信息,您应该查看您的数据库文档。

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        相关资源
        最近更新 更多