如何将判断列是否为数值的SQL语句转换为JPQL?
将SQL转换为JPQL实现数值/字母数字判断
基于支持TRANSLATE的JPA实现(如Hibernate)
如果你的JPA实现(比如Hibernate)支持TRANSLATE函数,可以直接把原生SQL映射为JPQL,只需将数据库表名替换为实体类名、列名替换为实体属性名:
SELECT CASE WHEN TRIM(TRANSLATE(e.myColumn, '0123456789-,.', ' ')) IS NULL THEN 'integer' ELSE 'char' END FROM MyEntity e
MyEntity是对应数据库表my_table的实体类名称myColumn是实体类中对应my_column字段的属性名(注意大小写要和实体类定义一致)
标准JPQL兼容方案(无TRANSLATE支持时)
如果使用的是严格遵循JPQL标准的实现,TRANSLATE并非标准函数,你可以用正则匹配的方式替代逻辑(多数主流JPA实现支持正则表达式函数,比如Hibernate的REGEXP):
SELECT CASE WHEN e.myColumn REGEXP '^[0-9-,.]*$' THEN 'integer' ELSE 'char' END FROM MyEntity e
这个语句的逻辑和原SQL完全等价:判断字段值是否仅包含数字、-、,、.这些字符,是则标记为integer,否则标记为char。
如果你的JPA实现不支持正则,也可以用数据库的模式匹配语法(比如MySQL的否定LIKE),但这种方式依赖具体数据库:
SELECT CASE WHEN e.myColumn NOT LIKE '%[^0-9-,.]%' THEN 'integer' ELSE 'char' END FROM MyEntity e
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

