我问这个问题是为了展示 MySQL 和 Hibernate 如何使用正则表达式相互工作。
问题:
SELECT * FROM table WHERE regexp column '\d'
解决方案:
转到我的答案。
希望这可以帮助。
基本上,要在 Hibernate 中使用 MySQL 正则表达式函数,我们需要创建一个“SQLFunctionTemplate”。
现在,如何做到这一点:
首先:创建一个名为“AppMySQLDialect”的类并从 MySQLDialect 扩展,然后覆盖空构造函数,最后注册 regexp 函数:
public class AppMySQLDialect extends MySQLDialect {
public AppMySQLDialect() {
super();
/**
* Function to evaluate regexp in MySQL
*/
registerFunction("regexp", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 REGEXP ?2"));
}
}
好的,现在让我们按如下方式使用它:
FROM Entity E WHERE regexp(E.string2evaluate, '\d') = 1
创建您的 HibernateQuery 并执行。
String range = "ABCD";
List<HRTrainee> hrTrainees =
(List<HRTrainee>)sessionFactory.getCurrentSession().createCriteria(HRTrainee.class)
.add(Restrictions.sqlRestriction("name REGEXP '^["+range+"]'")).list();
return hrTrainees;
REGEXP 在 MySQL 中被视为关键字。用户可以通过注册关键字在休眠过滤器中使用 REGEXP。创建一个类 ' CustomMySQL5InnoDBDialect ' 扩展MySQL5InnoDBDialect并注册关键字,如下所示:
public class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public CustomMySQL5InnoDBDialect() {
super();
/* register regexp keyword */
registerKeyword("regexp");
}
}
然后将persistence.xml中的hibernate-dialect属性更改为
<property name="hibernate.dialect" value="com.CustomMySQL5InnoDBDialect"/>
用户可以在休眠过滤器中使用正则表达式,如下所示
@Filters(value = { @Filter(name="applyStudentFilter",condition="id in (select s.id from student s WHERE s.address REGEXP :addressValue)"),
})