powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + regexp
11 сообщений из 11, страница 1 из 1
Hibernate + regexp
    #33088622
lev*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как написать на HQL запрос который будет искать объект по простенькому паттерну: у меня есть поле name, и пользователь может вводить его вместе с "*" и "?" - как писк в винде. Как это можно сдеать? И есть ли возможности искать по регулярному выражению? Или нужно запрашивать всё и потом делать Regex.Match?
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33088640
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что невозможно. В SQL нет стандарта на RegExp - а все HSL транслируются в SQL. Так чо Regex.Match верный путь, однако
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33088643
lev*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrushokЯ думаю, что невозможно. В SQL нет стандарта на RegExp - а все HSL транслируются в SQL. Так чо Regex.Match верный путь, однако

Ну а если надо осуществить поиск как мы в винде делаем - с "*" "?", неужели нельзя!? Вот в Oracle 10.G есть regex_substr, кажется. В принципе на нём всё и будет работать. Но через jdbc нельзя - начальник убьёт.
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33088672
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL есть LIKE - шо совсем не RegExp. Ну а всяки там функции - пожалте. Их даже к Hibernate прикрутить можно через вызов SP например. Вот тольки в самом Hibernate я ничего подобного не видел. Хотя, я еще не очень его хорошо знаю ...
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33088742
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так есть же Session.createSQLQuery() для Native SQL запросов?
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090428
lev*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMТак есть же Session.createSQLQuery() для Native SQL запросов?

Так не пойдёт. Нужно чтоб переносимо было.
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090456
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lev*

Я бы написал stored procedure на SQL-диалекте вашей СУБД и использовал его из DAO-слоя. HQL тут скорее всего будет не эффективен
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090525
lev*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri lev*

Я бы написал stored procedure на SQL-диалекте вашей СУБД и использовал его из DAO-слоя. HQL тут скорее всего будет не эффективен

К сожалению, нужно делать это только средствами Hibernate, т.к. чисто теоретически всё должно работать "везде", но работать будет только на
Oracle 10g, а там даже есть что-то типа regexp встроенного.
Но мне пока нужно только ? и * реализовать, и я бы хотел это сделать при помощи Criteria:

List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or(
Expression.eq( "age", new Integer(0) ),
Expression.isNull("age")
) )
.list();

Остаётся вопрос: * -> %, ? -> _, а как в hibernate escape посл-ть задавать?
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090553
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HQL отображается на SQL. Хотите 100% переносимость без какой-либо адаптации к платформе - придется использовать Ansi SQL. Там вроде про RegEx ничего нет, так что ваша задача в таком виде решаться не будет. Если сможете - выкручивайтесь с помощью like
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090599
lev*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriHQL отображается на SQL. Хотите 100% переносимость без какой-либо адаптации к платформе - придется использовать Ansi SQL. Там вроде про RegEx ничего нет, так что ваша задача в таком виде решаться не будет. Если сможете - выкручивайтесь с помощью like

Я же говорю, что я regexp через hql делать не буду, а хочу сделать поиск по простейшим шаблонам: * - ноль или много, и ? - один. и хочу сделать like
(типа createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") ), но не знаю как здесь задать escape посл-ть - ведь в имени могут встречаться, например, подчёркивания.
...
Рейтинг: 0 / 0
Hibernate + regexp
    #33090675
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А фантазию проявить? :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 import  org.hibernate.Criteria;
 import  org.hibernate.HibernateException;
 import  org.hibernate.engine.TypedValue;

 public   class  EscapedLikeExpression  implements  Criterion {

         private   final  String propertyName;
         private   final  Object value;
         private   final   char  escape;

         public  EscapedLikeExpression(String propertyName, Object value,  char  escape) {
                 this .propertyName = propertyName;
                 this .value = value;
                 this .escape = escape;
        }

         public  String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
         throws  HibernateException {
                String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
                 if  (columns.length!= 1 )
                 throw   new  HibernateException("escaped like may only be used with single-column properties");
                 return  columns[ 0 ] + " like ? escape '"+escape+"' ";
        }

         public  TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery)
         throws  HibernateException {
                 return   new  TypedValue[]
                { criteriaQuery.getTypedValue( criteria, propertyName, value.toString().toLowerCase() ) };
        }

         public  String toString() {
                 return  propertyName + " like " + value + " escape '"+escape+"'";
        }

}
Код: plaintext
1.
2.
createCriteria(Cat. class )
.add(  new  EscapedLikeExpression("name", "Fritz%", '$') )
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + regexp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]