【问题标题】:how to use regular expression in EJB named query如何在 EJB 命名查询中使用正则表达式
【发布时间】:2010-10-30 06:26:32
【问题描述】:

我在mysql中有查询

从 TBLM_CUSTOMER 中选择 COUNT(DISTINCT MOBILE),其中 MOBILE NOT REGEXP '^00*0$' AND LENGTH(MOBILE) >= 10;

我正在使用 EJB 3.0,我想使用 NamedQuery 进行相同的查询,使用 createQuery 也可以进行相同的操作,但我想使用 NamedQuery。

是否可以在 EJB 3.0 中使用 NamedQuery 使用正则表达式?

【问题讨论】:

    标签: java orm jpa


    【解决方案1】:

    首先,REGEXP 不是 JPA 定义的标准 JPQL 函数,而是特定于平台的 SQL。如果它与您当前的 JPA 提供程序一起使用(其中一些可能将 WHERE 子句中的特定于平台的 SQL 直接传递给数据库,其中一些可能支持扩展给定的方言),则不能保证可移植性(如果这很重要)。

    话虽如此,如果您使用createQuery(String) 使其工作,则没有理由不能使用NamedQuery。你有没有尝试过这样的事情:

    SELECT COUNT(DISTINCT MOBILE) FROM TBLM_CUSTOMER WHERE MOBILE NOT REGEXP :regexp AND LENGTH(MOBILE) >= :length;
    

    PS:也许这只是一个例子,但为什么不使用[NOT] LIKE 来保持查询的可移植性?

    【讨论】:

    • 在 jpql 中正则表达式是否与 LIKE 选项一起使用?
    【解决方案2】:

    SELECT COUNT(DISTINCT o.MOBILE) FROM Customer WHERE o.MOBILE != '^00*0$' AND LENGTH(o.MOBILE) >= 10;

    其中 Customer 是我们的实体 bean,查询工作与 EJB 中的 nativequery 一样好

    【讨论】:

    • o.MOBILE != '^00*0$' .. 呃?没有正则表达式?
    • ^00*0$ 我写这个是因为我希望手机中的所有数字都不能包含零。
    • 这是 mysql 简单查询 --- SELECT COUNT(DISTINCT MOBILE) FROM TBLM_CUSTOMER WHERE MOBILE NOT REGEXP '^00*0$' AND LENGTH(MOBILE) >= 10;
    • EJB 中的这个查询给出了相同的结果 -- SELECT COUNT(DISTINCT o.MOBILE) FROM Customer WHERE o.MOBILE != '^00*0$' AND LENGTH(o.MOBILE) >= 10个; -- 我也用mysql的其他正则表达式测试了这个
    猜你喜欢
    • 2015-08-01
    • 2013-04-27
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多