Java 在HQL和MySql数据库中使用TRIM引导函数
我正在数据库上查询,以检查电话号码范围是否相互重叠 有些数字存储为前面有一个“+”字符:+332457896,而另一些数字存储时没有“+”字符:332457897 因此,在进行比较之前,我想删除潜在的前导“+” 我发现MySQL Trim函数在MySQL Workbench中运行良好,甚至与hibernate一起使用本机查询:Java 在HQL和MySql数据库中使用TRIM引导函数,java,mysql,hibernate,hql,trim,Java,Mysql,Hibernate,Hql,Trim,我正在数据库上查询,以检查电话号码范围是否相互重叠 有些数字存储为前面有一个“+”字符:+332457896,而另一些数字存储时没有“+”字符:332457897 因此,在进行比较之前,我想删除潜在的前导“+” 我发现MySQL Trim函数在MySQL Workbench中运行良好,甚至与hibernate一起使用本机查询: TRIM(LEADING '+' FROM MyColumn) 但当我尝试使用hibernate HQL查询执行相同操作时,我得到一个错误: org.hibernate
TRIM(LEADING '+' FROM MyColumn)
但当我尝试使用hibernate HQL查询执行相同操作时,我得到一个错误:
org.hibernate.hql.internal.ast.ErrorCounter-预期加入的路径
我猜这与“From”关键字有关
EJB-QL 3.0支持I checked and Trim函数,其语法为:
修剪([前导|尾随|两侧][自]字符串)
编辑:这是我用来执行这个查询的java代码
startNumber和endNumber是我尝试创建的范围的完整电话号码。
我将其与Range表进行检查,通过关联prefix和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();
}
公共列表findRangeOverlap(字符串pStartNumber、字符串pEndNumber){
StringBuilder jpaQuerySb=新建StringBuilder(“从MyTable p中选择p”);
//重叠限制
//为了可读性,请提取字符串以构建所有其他范围的开始和结束编号
String otherStart=“TRIM(CONCAT的前导“+”(IFNULL(p.prefix)”),IFNULL(p.rangeStart)”)”;
String otherEnd=“TRIM(CONCAT中的前导“+”(IFNULL(p.prefix)”),IFNULL(p.rangeEnd)”)”;
//然后检查重叠
jpaQuerySb.append(“其中(:start>=”).append(其他开始);
jpaQuerySb.append(“and:start=”).append(otherStart);
jpaQuerySb.append(“and:end你试过了吗
return entityManager().createNativeQuery(jpaQuerySb.toString(), Range.class).getResultList();
?
如果构建本机查询,则必须使用实体管理器的适当方法。这对您有帮助吗:?您好,谢谢,但我已经这样做了,concat工作正常,它只是TRIM函数所需的FROM关键字,我想它只有一个参数块。如果没有,通常添加+怎么样?您可以发布吗ur代码?添加了在主帖子中生成的HQL查询。我在复制的代码中犯了一个错误,没有使用我用参数实例化的查询,而是从StringBuilder中重新生成了一个查询。更正了主帖子中的代码以使其清晰,如果我将字符串查询改为SQL而不是HQL,则可以使用nativeQuery(就像它在MySql Workbench中工作一样)我的问题是如何让它在HQL中工作?