4

我问这个问题是为了展示 MySQL 和 Hibernate 如何使用正则表达式相互工作。

问题:

SELECT * FROM table WHERE regexp column '\d'

解决方案:

转到我的答案。

希望这可以帮助。

4

3 回答 3

5

基本上,要在 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 并执行。

于 2013-07-17T14:29:26.477 回答
2
String range = "ABCD";

List<HRTrainee> hrTrainees =
      (List<HRTrainee>)sessionFactory.getCurrentSession().createCriteria(HRTrainee.class)

.add(Restrictions.sqlRestriction("name REGEXP '^["+range+"]'")).list();

return hrTrainees;
于 2015-08-19T14:46:38.187 回答
0

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)"),
})
于 2019-09-28T04:06:45.933 回答