【问题标题】:Using TRIM LEADING function with HQL and MySql database在 HQL 和 MySql 数据库中使用 TRIM LEADING 函数
【发布时间】:2017-04-08 16:35:10
【问题描述】:

我正在对数据库进行查询以检查电话号码范围是否相互重叠。

一些数字存储为前面有一个“+”字符:+332457896,而另一些则没有它存储:332457897。

所以在进行比较之前,我想删除潜在的领先“+”。

我发现 MySQL Trim 函数在 MySQL Workbench 中运行良好,甚至在使用本机查询的 hibernate 中运行良好:

TRIM(LEADING '+' FROM MyColumn)

但是当我尝试使用 hibernate HQL 查询做同样的事情时,我得到一个错误:

org.hibernate.hql.internal.ast.ErrorCounter - 期望加入的路径!

我猜它与“From”关键字有关。

我查了一下,EJB-QL 3.0 支持 Trim 函数,它的语法是:

trim([leading | trailing | both] [from] String)

编辑:这是我用来执行此查询的 java 代码

startNumber 和 endNumber 是我尝试创建的范围的完整电话号码。 然后我通过连接前缀和 rangeStart / rangeEnd 列将其与构建现有 rangeStart 和 rangeEnd 编号的 Range 表进行对比。

public List<Range> findRangeOverlap(String pStartNumber, String pEndNumber) {
    StringBuilder jpaQuerySb = new StringBuilder("SELECT p FROM MyTable p ");

    // Overlap restriction
    // For readability extract the string to build the start and end number for all the other range
    String otherStart = "TRIM(LEADING '+' FROM CONCAT(IFNULL(p.prefix, ''), IFNULL(p.rangeStart, ''))) ";
    String otherEnd = "TRIM(LEADING '+' FROM CONCAT(IFNULL(p.prefix, ''), IFNULL(p.rangeEnd, ''))) ";

    // Then check for overlap
    jpaQuerySb.append("where ( (:start >= ").append(otherStart);
    jpaQuerySb.append("and :start <= ").append(otherEnd).append(")");
    jpaQuerySb.append("or ( :end >= ").append(otherStart);
    jpaQuerySb.append("and :end <= ").append(otherEnd).append("))");

    Query q = entityManager().createQuery(jpaQuerySb.toString());
    q.setParameter("start", pStartNumber);
    q.setParameter("end", pEndNumber);

    return q.getResultList();
}

【问题讨论】:

  • 这对您有帮助吗:stackoverflow.com/questions/8355719/… ?
  • 嗨,谢谢,但这已经是我的工作方式了,concat 工作正常,它只是 TRIM 函数所需的 FROM 关键字,它只有 1 个参数,我认为。跨度>
  • 如果没有+,一般加+怎么办?
  • 你能发布你的代码吗?
  • 添加了 1 小时前在主帖中生成的 HQL 查询

标签: java mysql hibernate hql trim


【解决方案1】:

你试过了吗

return entityManager().createNativeQuery(jpaQuerySb.toString(), Range.class).getResultList();

?

如果您构建原生查询,则必须使用实体管理器的相应方法。

【讨论】:

  • 抱歉在我复制的代码中犯了一个错误,没有使用我用参数实例化的查询,而是从 StringBuilder 重建一个。更正了主帖中的代码
  • 明确地说,如果我将字符串查询更改为 SQL 而不是 HQL(就像它在 MySql Workbench 中一样),它可以与 nativeQuery 一起正常工作。我的问题是如何使它与 HQL 一起使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
相关资源
最近更新 更多