Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + запрос с пользовательской функцией / 25 сообщений из 27, страница 1 из 2
16.01.2012, 11:32:25
    #37615866
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
С хибером общаюсь относительно недавно(а мое прошлое дает о себе знать) я хотеть использовать в запросе какую либо пользовательскую функцию, что нибудь вроде:
"select * from entity where MyClass.myStatMethod(id)"
Такое возможно?
...
Рейтинг: 0 / 0
16.01.2012, 11:40:27
    #37615877
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Скорее всего нет. Разбейте это на вычисление значения функции и подстановку в полученного значения в запрос.
...
Рейтинг: 0 / 0
16.01.2012, 11:43:55
    #37615880
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
ОзверинС хибером общаюсь относительно недавно(а мое прошлое дает о себе знать) я хотеть использовать в запросе какую либо пользовательскую функцию, что нибудь вроде:
"select * from entity where MyClass.myStatMethod(id)"
Такое возможно?
только в СУБД с прекомпиляцией для ускорения UDF
...
Рейтинг: 0 / 0
16.01.2012, 11:48:44
    #37615889
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
svenom,

хорошо - тогда чуть иначе.
В таблице 2 поля(id, text). Значения первого поля = int (описания поля в сущности @Enumerated(value = EnumType.ORDINAL) сейчас это около 19 макс).
Значение второго поля хотелось бы вычислить из первого, что нить вроде описание поля в сущности @Enumerated(value = EnumType.STRING).
или
if id=1 text="id1"
if id=2 text="id2"
if id=3 text="id3"

Так как данных очень не мало, не хотелось бы делать выборку объектов, все их исправлять, а потом апдейтить.

Сама задача возникла в результате merge нескольких веток и в последующем вряд ли понадобиться.
...
Рейтинг: 0 / 0
16.01.2012, 11:51:24
    #37615896
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверин,
- занафига это надо? Составной ключик?
- ОДНИМ SQL запросом на Update
...
Рейтинг: 0 / 0
16.01.2012, 11:55:35
    #37615905
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Petro123,

так чтобы обновить одним запросом ..нужен запрос вида:
"update e set text=MyClass.myMethod(id)"
...
Рейтинг: 0 / 0
16.01.2012, 11:58:51
    #37615913
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
ОзверинPetro123,
так чтобы обновить одним запросом ..нужен запрос вида:
"update e set text=MyClass.myMethod(id)"
я в это HQL\ORM не врубаюсь :)
- надо в СУБД
Код: java
1.
UPDATE tabla set text='id' + ToString(id)
...
Рейтинг: 0 / 0
16.01.2012, 12:06:54
    #37615938
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Petro123,

ну я примитивно привел логику обновления поля text )
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
enum MyEnum{
 SECOND(),  
 MINUTE(),
 HOUR(),

 private MyEnum() {

 }

}



Так вот, на данный момент в таблице есть поле id - которое хранит порядок перечисления(1,2,3), я добавляю поле text=которое будет хранить SECOND, MINUTE, HOUR. При первом старте надо обновить поле text по существующим id ) согласно моему MyEnum
...
Рейтинг: 0 / 0
16.01.2012, 12:18:37
    #37615962
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверин,
оператор SQL decode вроде можно в SQL

Код: sql
1.
decode(s."SUBJID", 37, '1. Предпроектная', 38, '2. Конкурсная', 39, '3. Проектная', 29, '4. Строительство')
...
Рейтинг: 0 / 0
16.01.2012, 12:20:24
    #37615966
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
ещё сложнее условия, уже CASE, но его вроде только в VIEW
Поэтому на СУБД я бы решал в динамике = VIEW с CASE над таблицей
...
Рейтинг: 0 / 0
16.01.2012, 12:28:55
    #37615992
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Petro123,

ok, спс;)
...
Рейтинг: 0 / 0
16.01.2012, 15:12:00
    #37616355
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверин
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
enum MyEnum{
 SECOND(),  
 MINUTE(),
 HOUR(),

 private MyEnum() {

 }

}



Так вот, на данный момент в таблице есть поле id - которое хранит порядок перечисления(1,2,3), я добавляю поле text=которое будет хранить SECOND, MINUTE, HOUR. При первом старте надо обновить поле text по существующим id ) согласно моему MyEnum
это тоже абстрактный пример или уже то, что действительно надо сделать? если второе, то вопрос - зачем?
...
Рейтинг: 0 / 0
16.01.2012, 15:19:49
    #37616382
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
off
chpasha,
ну ему наверно приказали, да и всё.
Если защищать ОРМ, то наверно тоже есть варианты:
- вычисляемое поле замаппить (фальшивое)
- это справочник и его можно штатно завести в системе.
- это лог поминутный и
куча если :)
...
Рейтинг: 0 / 0
16.01.2012, 15:26:50
    #37616402
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Petro123off
chpasha,
ну ему наверно приказали, да и всё.
я потому и спрашиваю. на лицо ненужное дублирование информации. уже есть энум, и уже есть его порядковое представление в бд. любое текстовое представление из порядкового можно получить автоматом из энума.

Petro123Если защищать ОРМ, то наверно тоже есть варианты:
просто вводится новая пользовательская функция в диалект, например

Код: java
1.
registerFunction("to_hours", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "floor(extract(epoch from ?1)/3600)"));


а дальше пишется HQL как и хотел автор. но пока не очевидно нужно ли это.
...
Рейтинг: 0 / 0
16.01.2012, 15:29:41
    #37616409
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpasha,
+1
значит есть аналог UDF - круто
...
Рейтинг: 0 / 0
16.01.2012, 15:34:58
    #37616427
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Petro123chpasha,
+1
значит есть аналог UDF - круто
это не аналог, это и есть пользовательская функция (или любая другая). HQL передает ее как есть дальше на сервер. это пример, как расширить доступные в HQL функции своими путем кастомизации диалекта. точно так же можно ввести дополнительный тип, который может преобразовывать на лету 1,2,3 в SECONDS, HOURS и т.д. потому и не ясно, зачем их хранить явно.
...
Рейтинг: 0 / 0
16.01.2012, 15:42:05
    #37616453
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpasha,

я ж говорил причину, на период merge бранча и транка(когда работают старые версии программ и ставятся новые) нужна подобная функциональность и дублирование информации.
...
Рейтинг: 0 / 0
16.01.2012, 15:43:43
    #37616455
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpasha,

как создать на лету пользовательскую ф-ю в базе я знаю )
...
Рейтинг: 0 / 0
16.01.2012, 15:45:13
    #37616461
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpasha,

блин, но пример с секундами и минутами абстрактный...там более слонжые названия перечисляемых полей, зачем так буквально воспринимать? Контекст задачи важен, а не данные..представьте, что перечисление абстрактное.
...
Рейтинг: 0 / 0
16.01.2012, 15:49:13
    #37616473
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверинchpasha,

я ж говорил причину, на период merge бранча и транка(когда работают старые версии программ и ставятся новые) нужна подобная функциональность и дублирование информации.
т.е. если по-русски, есть код, который зависит от наличия этого поля, так?
имхо более лаконичным будет табличная функция: массив типа ['','SECDONDS','MINUTES'] и т.д. где позиция соответствует порядковому номеру. ee и вызывать. но для одного раза можно и update с case, и не понятно зачем для одного раза ОРМ приплетать. тут как раз работа для JDBC.
...
Рейтинг: 0 / 0
16.01.2012, 15:51:42
    #37616480
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверинchpasha,
там более слонжые названия перечисляемых полей, зачем так буквально воспринимать?
мой пример тоже абстрактный, это совпадение, что он с датами работает.

если нужно многократно - функция на стороне сервера. если однократно - скрипт на JDBC и забыл.
...
Рейтинг: 0 / 0
16.01.2012, 15:57:02
    #37616498
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpashaОзверинchpasha,

я ж говорил причину, на период merge бранча и транка(когда работают старые версии программ и ставятся новые) нужна подобная функциональность и дублирование информации.
т.е. если по-русски, есть код, который зависит от наличия этого поля, так?
имхо более лаконичным будет табличная функция: массив типа ['','SECDONDS','MINUTES'] и т.д. где позиция соответствует порядковому номеру. ee и вызывать. но для одного раза можно и update с case, и не понятно зачем для одного раза ОРМ приплетать. тут как раз работа для JDBC.

ну орм приплетать потому что стандартных средств JDBC я не знаю для решения подобной задачи, а создание ф-и на лету придется прилично "кодировать" рефлексию, т.к. merge может длиться месяц другой, а логика на месте не стоит ;) В любом случае спасибо, буду думать дальше.
...
Рейтинг: 0 / 0
16.01.2012, 16:05:23
    #37616523
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверинну орм приплетать потому что стандартных средств JDBC я не знаю для решения подобной задачи
для одноразового апдейта самое то. хотя я начинаю подозревать, что видимо не понимаю задачу. потому что проапдейтить данные один раз можно десятком способов. или речь именно о select * where?

Озверин, а создание ф-и на лету придется прилично "кодировать" рефлексию
почему налету? если мы все еще об энумах, то закодировать существующие состояния + добавлять новые.

кстати как на счет динамически генерить where с помощью criteria, имхо они как раз для этого.
...
Рейтинг: 0 / 0
16.01.2012, 16:12:32
    #37616543
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
chpasha,

одноразовый апдейт не сгодится , т.к. с одной базой могут работать и старые версии и новые.
...
Рейтинг: 0 / 0
16.01.2012, 16:25:35
    #37616584
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate + запрос с пользовательской функцией
Озверинchpasha,
одноразовый апдейт не сгодится , т.к. с одной базой могут работать и старые версии и новые.
почему?
У меня в БД был флаг версии и на клиенте. Клиент стартуя, проверяет версию и либо кричит, либо сам ОДНОРАЗОВО апдейтит.
В 1С тоже так.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + запрос с пользовательской функцией / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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