将TRIM LEADING函数与HQL和MySql数据库

时间:2016-11-24 11:29:31

标签: java mysql hibernate hql trim

我正在对数据库进行查询,以检查彼此重叠的电话号码范围。

有些号码存储为' +'前面的char:+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是我尝试创建的范围的完整电话号码。 我在Range表中检查它,通过连接前缀和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();
}

1 个答案:

答案 0 :(得分:1)

你试过吗

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

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