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

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

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

Я бы написал stored procedure на SQL-диалекте вашей СУБД и использовал его из DAO-слоя. HQL тут скорее всего будет не эффективен
...
Рейтинг: 0 / 0
30.05.2005, 13:04
    #33090525
lev*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + regexp
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
30.05.2005, 13:15
    #33090553
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + regexp
HQL отображается на SQL. Хотите 100% переносимость без какой-либо адаптации к платформе - придется использовать Ansi SQL. Там вроде про RegEx ничего нет, так что ваша задача в таком виде решаться не будет. Если сможете - выкручивайтесь с помощью like
...
Рейтинг: 0 / 0
30.05.2005, 13:34
    #33090599
lev*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + regexp
funikovyuriHQL отображается на SQL. Хотите 100% переносимость без какой-либо адаптации к платформе - придется использовать Ansi SQL. Там вроде про RegEx ничего нет, так что ваша задача в таком виде решаться не будет. Если сможете - выкручивайтесь с помощью like

Я же говорю, что я regexp через hql делать не буду, а хочу сделать поиск по простейшим шаблонам: * - ноль или много, и ? - один. и хочу сделать like
(типа createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") ), но не знаю как здесь задать escape посл-ть - ведь в имени могут встречаться, например, подчёркивания.
...
Рейтинг: 0 / 0
30.05.2005, 14:01
    #33090675
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + regexp
А фантазию проявить? :)
Код: 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + regexp / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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