我正在查询数据库以检查互相重叠的电话号码范围。在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();
}
这是否帮助您:http://stackoverflow.com/questions/8355719/calling-a-mysql-function-returning-varchar-in-hibernate? – actc
嗨,谢谢,但这已经是我如何做了,concat工作正常,它只是TRIM函数所需的FROM关键字,它只有1个参数哪个块,我想。 – TheBakker
一般情况下,如果没有的话,一般会添加什么? – actc