Hibernate Regexp MySQL

后端 未结 3 1081
天命终不由人
天命终不由人 2020-12-10 19:45

I ask this question to show how MySQL and Hibernate work each other with Regular Expressions.

The problem:

SELECT * FROM table WHERE regexp column \'         


        
相关标签:
3条回答
  • 2020-12-10 20:26

    REGEXP is treated as a keyword in MySQL. User can use REGEXP in hibernate filter by registering the keyword. Create a class 'CustomMySQL5InnoDBDialect' extending MySQL5InnoDBDialect and register the keyword as follows :

    public class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
    
    public CustomMySQL5InnoDBDialect() {
        super();
       /* register regexp keyword */
        registerKeyword("regexp");
    }
    }
    

    Then change the hibernate-dialect property in persistence.xml as

    <property name="hibernate.dialect" value="com.CustomMySQL5InnoDBDialect"/>
    

    User can use the regexp in hibernate filter as follows

    @Filters(value = {  @Filter(name="applyStudentFilter",condition="id in (select s.id from student s WHERE s.address REGEXP :addressValue)"),
    })
    
    0 讨论(0)
  • 2020-12-10 20:30
    String range = "ABCD";
    
    List<HRTrainee> hrTrainees =
          (List<HRTrainee>)sessionFactory.getCurrentSession().createCriteria(HRTrainee.class)
    
    .add(Restrictions.sqlRestriction("name REGEXP '^["+range+"]'")).list();
    
    return hrTrainees;
    
    0 讨论(0)
  • 2020-12-10 20:36

    Basically, to use MySQL regexp function in Hibernate we need to create a "SQLFunctionTemplate".

    Now, how to do it:

    First: Create a class called "AppMySQLDialect" and extends from MySQLDialect then override the empty constructor and finally register the regexp function:

    public class AppMySQLDialect extends MySQLDialect {
        public AppMySQLDialect() {
            super();
            /**
             * Function to evaluate regexp in MySQL
             */
            registerFunction("regexp", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 REGEXP ?2"));
        }
    }
    

    Ok, now lets use it as follow:

    FROM Entity E WHERE regexp(E.string2evaluate, '\d') = 1
    

    Create your HibernateQuery and execute.

    0 讨论(0)
提交回复
热议问题