java - 在 HQL 和 MySql 数据库中使用 TRIM LEADING 函数

标签 java mysql hibernate hql trim

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

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

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

我发现 MySQL Trim 函数在 MySQL Workbench 中运行良好,甚至在使用 native 查询的 hibernate 中也能正常运行:

TRIM(LEADING '+' FROM MyColumn)

但是当我尝试使用 hibernate HQL 查询执行相同操作时,出现错误:

org.hibernate.hql.internal.ast.ErrorCounter - Path expected for join!

我猜它与“发件人”关键字有关。

我检查过,Trim 函数受 EJB-QL 3.0 支持,其语法是:

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

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

startNumber 和 endNumber 是我要创建的范围的完整电话号码。 我通过连接前缀和 rangeStart/rangeEnd 列,对照我从中构建现有 rangeStart 和 rangeEnd 编号的范围表检查它。

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();
}

最佳答案

你试过吗

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

?

如果您构建 native 查询,则必须使用实体管理器的适当方法。

关于java - 在 HQL 和 MySql 数据库中使用 TRIM LEADING 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785275/

相关文章:

java - 如何从另一个类调用方法?

java - WSO2 EI : First Element must contain the local name, 信封,但找到 html

mysql - MySQL 两列之间相减的 WHERE 子句

Spring MVC i18n Hibernate 验证

java - 单元测试之间数据库未删除

java - 相等性测试(equals 和 hashcode 方法)

java - 将异常从 Runnable 线程抛出到调用方法中

php - 从 SELECT 中获取 UTF8 值 ... 像 Mysql 中的请求

查询之间的mysql时间戳

hibernate - 使用和/或在标准中时出现 NullPointerException