Получение результатов с использованием JPA Criteria Builder, где числовые поля содержатся только там, где атрибут имеет буквенно-цифровые значения в MySQL

Я хотел знать, как делать запросы с помощью JPA CriteriaBuilder, где атрибут userCode типа String представляет число.

у меня есть:

Id    name    userCode
1     ABC     ABCD_123
2     XYZ     ABC_EFGH
3     TEST    7845
4     TEst2   85245

Теперь я просто хотел получить результат, имеющий только числовое значение userCode.

Спасибо


person Ashish Ratan    schedule 24.11.2015    source источник
comment
Возможный дубликат Как правильно привести строку к номеру с API критериев JPA2?   -  person perissf    schedule 24.11.2015
comment
@perissf Я не думаю, что это дублирующий вопрос. Я не разбираю строку. Мое требование отличается.   -  person Ashish Ratan    schedule 24.11.2015


Ответы (3)


Я считаю, что в JPA нет функции для этого (отношения JPA через коллекцию будут отображать все связанные элементы, независимо от того, были они числовыми или нет). В любом случае, вы можете либо использовать собственный запрос, чтобы база данных возвращала их фильтр, либо использовать любую функцию вашей реализации JPA, например:

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/j_regexp.htm

Что позволяет JPA использовать регулярные выражения с извлеченными строками.

person Facepalmed    schedule 24.11.2015
comment
Разве мы не можем использовать для этого Criteria Builder, а не JPQL? - person Ashish Ratan; 24.11.2015
comment
Конечно, но я обычно предпочитаю jpql, чем построитель критериев, потому что, если они аннотированы как именованные запросы, они компилируются перед выполнением и предотвращают сбои во время выполнения, но ваше решение, как это реализовать. - person Facepalmed; 24.11.2015
comment
Я полностью согласен с тобой, дорогая. Но здесь другой сценарий, поэтому я хочу использовать Criteria Builder, а не JPQL. А за ссылку спасибо, полезно - person Ashish Ratan; 24.11.2015

Вы можете вызывать функции, используя CriteriaBuilder.function(name, ret_type, args).

Вы не сказали, какую СУБД вы используете, поэтому я предполагаю, что у вас есть некоторая доступная функция, которую вы могли бы вызвать в SQL следующим образом:

SELECT * FROM user_account WHERE is_numeric(userCode);

Вы можете представить это в Criteria API следующим образом:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
Path<String> userCode = root.get(User_.userCode);
Expression<Boolean> numeric = builder.function("is_numeric", Boolean.class, userCode);

query.select(root).where(numeric);

См. Документация по API для function(...).


Возможная функция EDIT в MySQL (не проверена)

CREATE FUNCTION is_numeric(val VARCHAR(1024)) 
RETURNS TINYINT(1) DETERMINISTIC 
RETURN val REGEXP '^(-|\\+)?([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

(источник)

person jabu.10245    schedule 25.11.2015
comment
примечание: метод function был введен в JPA 2.1 - person wypieprz; 09.12.2015

Если вы используете Eclipselink, вы можете использовать Регулярное выражение REGEXP (оценивает, соответствует ли string регулярному выражению из 2.4) или лучше использовать собственный запрос для этого требования. В собственном запросе вы можете использовать функцию REGEXP_LIKE, например, для поиска нечисловых символов:

SELECT *
  FROM <table>
 WHERE REGEXP_LIKE(<column>, '[^[:digit:]]');
person Sai prateek    schedule 24.11.2015
comment
Ммм ... спасибо за хороший ответ, но дорогой, я хочу решение, использующее JPA Criteria Builder, а не JPQL. - person Ashish Ratan; 24.11.2015