2016-11-24 52 views
1

我正在查询数据库以检查互相重叠的电话号码范围。在HQL和MySql数据库中使用TRIM LEADING函数

一些数字形式存储在前面有“+”字符:332457896和其他存储离不开它:332457897.

这样算下来comparaison之前,我想删除的潜力龙头“+”。

我发现MySQL的微调功能,使用本机查询在MySQL工作台,甚至与Hibernate正常工作:

TRIM(LEADING '+' FROM MyColumn) 

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

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

我猜它与'From'关键字有关。

我检查和Trim功能由EJB-QL 3.0的支持,它的语法是:

TRIM([领导|尾随|两者] [从]字符串)

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

startNumber和endNumber是我尝试创建的范围的完整电话号码。 然后我通过concataining前缀和rangeStart/rangeEnd列来检查Range表,我通过Range表构建现有的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(); 
} 
+0

这是否帮助您:http://stackoverflow.com/questions/8355719/calling-a-mysql-function-returning-varchar-in-hibernate? – actc

+0

嗨,谢谢,但这已经是我如何做了,concat工作正常,它只是TRIM函数所需的FROM关键字,它只有1个参数哪个块,我想。 – TheBakker

+0

一般情况下,如果没有的话,一般会添加什么? – actc

回答

1

你尝试

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

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

+0

对不起在我复制的代码中犯了一个错误,没有使用查询,而是使用params实例化,而是使用StringBuilder重建一个。 更正了主帖子中的代码 – TheBakker

+0

要清楚的是,如果我将String查询更改为SQL而不是HQL(就像它在MySql Workbench中工作一样),它对nativeQuery可以正常工作。 我的问题是如何使它与HQL一起工作? – TheBakker