powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Repository, nativeQuery. передать массив как параметр запроса
35 сообщений из 35, показаны все 2 страниц
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39918953
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Надо сделать что-то типа такого:

Код: java
1.
2.
@Query(value = "select field1 from table1 where field2 = :param1 and field3 in (:param2)", nativeQuery = true)
Optional<Long> getField1List(@Param("param1") Date reportDate, @Param("param2") Long[] idList);


Подскажите, как это можно реализовать?
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919047
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Надо сделать что-то типа такого

Ишь ты, какой хитрый. Думаю оно такое не умеет аж где-то на уровне jdbc. Там вообще ограничение на то, что можно передать в in, что-то около 1000 id (хотя там все упирается в длину запроса). Да и надо походу писать что-то типа
Код: sql
1.
in (:param2, :param3, ..., :paramN)
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919061
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

Вообще вопрос интересный. Я сделал через таблицу с id, но мне тоже это не очень нравится. Предлагаю устроить какой-нибудь маленький холивар, чтобы тред не утонул.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919062
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

а разве spring-data-jpa запрещает тело метода репозитория писать?
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919077
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ща чтобы точно проверить под рукой ничего jpa-шного нет. Но в интернетах много примеров такого запроса, только вместо массива List-ы и Set-ы

crutchmaster
Думаю оно такое не умеет аж где-то на уровне jdbc.

Опять же проверять лень ща, но в jdbc есть всякие Array типы. Тут больше зависит от того, поддерживает конкретная база и как конкретно фигачит этот массив jpa. Вполне возможно, что он этот массив просто через запятую распишет сам.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919079
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя тут вопрос точно про in? - а native запрос вообще optional может возвращать?
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919085
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще операция с in не самая быстрая
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919139
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в некоторых базах данных (Oracle), значения in можно передать в виде массива
но по ANSI - никак, только макроподстановкой в тело запроса

AFAIK
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919272
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevв некоторых базах данных (Oracle)
Для явы ничего не нашел вменяемого на этот счёт. Есть биндинг оракляного клиента для ноды, там так нельзя, пишут мол делай через запятую.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919273
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

В оракле засунуть подзапрос в in тоже самое, что просто связать две таблицы.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919274
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan
Но в интернетах много примеров такого запроса, только вместо массива List-ы и Set-ы

Кидай ссылки, потому что я нахожу только костыли типа вот такого
https://stackoverflow.com/questions/3107044/preparedstatement-with-list-of-parameters-in-a-in-clause
Причём у них там Id штук 20, а надо тысяч 5.
Предлагают еще через массив в самой субд, как я понял, но хз как оно там будет работать.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919281
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тюнить базу и смотреть планы выполнения, оптимизатор субд вроде задачи не было.
Поэтому join массива в строку через запятую и в in parameter.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919285
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Поэтому join массива в строку через запятую и в in parameter.

А если список id очень большой?
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919287
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
PetroNotC Sharp
Поэтому join массива в строку через запятую и в in parameter.

А если список id очень большой?

В смысле для кого большой?
Для сети, для базы оптимизатора, для глаз человека?
Я как то искал ответ на вопрос, какая максимальная длина урл.
)))) 2048 символов.
Это много или мало?
Поэтому ответ - 1. это оффтоп в топике. 2. надо смотреть индивидуально.....для кого "много". Это архитектура.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919288
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
В смысле для кого большой?

Оракл, например, вываливает ошибку если там больше 1к ид.
https://stackoverflow.com/questions/400255/how-to-put-more-than-1000-values-into-an-oracle-in-clause
Запросы должны работать с любым массивом данных. И с 20 и с 25000
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919289
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Конечно тысяча много.
Но у ТС где видно что там тысяча?
Он вроде просто хотел записать код в пару строк.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919290
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Запросы должны работать с любым массивом данных. И с 20 и с 25000
в архитектуре нет такого требования.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919292
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
У меня в проекте два метода.
Один для больших данных, но тормозит многопользовательский режим.
Другой для маленьких, но не грузит этот режим.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919311
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

в интерфейсе Query есть метод setParameterList с несколькими перегрузками
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919313
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
в интерфейсе Query есть метод setParameterList с несколькими перегрузками

Что на выходе получится?
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919318
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
skyANA
в интерфейсе Query есть метод setParameterList с несколькими перегрузками

Что на выходе получится?

https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setParameterList(java.lang.String, java.util.Collection)
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919321
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет выполнена привязка списка значений к выражению вида
foo.bar in (:value_list).
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919354
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
Кидай ссылки, потому что я нахожу только костыли типа вот такого

В ней по порядку : link1 , link2 и т.д.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919376
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan,

SELECT * FROM employee WHERE employeeName IN (? , ?)
Так это работать не будет с длинной списка больше 1000 или как повезёт.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919486
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решено следующим образом:

Код: java
1.
2.
@Query(value = "select field1 from table1 where field2 = :param1 and field3 in :param2", nativeQuery = true)
List<Object> getField1List(@Param("param1") Date reportDate, @Param("param2") List<Long> idList);


Все работает как надо.
Спасибо!
Нашел вот здесь: https://www.logicbig.com/tutorials/spring-framework/spring-data/native-query.html
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919509
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
in (p1, p2, ...) это (p1 or p2 or p3 or ...)

В Oracle можно пойти разными путями, самый простой, но не самый "интересный"
поместить список во временную таблицу. Более интересные варианты, сделать через коллекцию
с запросом из коллекции, коллекцию можно объявить на уровне пакета и заполнить вызовами
написанной для этого процедуры, в этом случае можно повторно использовать данные пока состояние пакета живо.
Но я бы просто формировал CLOB и либо табличной либо конвейерной функцией его парсил на стороне Oracle,
выборка будет иметь вид select имя_поля from table(имя_пакета.имя_функции(сформированный нами clob));
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919515
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
пока состояние пакета живо.
да. В клиент сервере так и делают. Но там длинный коннект с состоянием, а тут веб. Обезличенный коннект из пула.
Надо смотреть откуда коллекции взялись на клиенте (аппСервер) . Зачем они там.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919524
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Тогда парсить CLOB, можно стандартными средствами, если CLOB содержит XML.
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919542
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,
Конечно можно всяко.
Если строку с разделителем распарсить на массив или таблу то там 1-2 строчки.
select regexp_substr(....) f from t
connect by....
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919563
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Когда список большой, всяко лучше чем в in запихивать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t (id, val) as
(
            select 3,  'val3'  from dual
  union all select 5,  'val5'  from dual
  union all select 7,  'val7'  from dual
  union all select 10, 'val10' from dual
  union all select 22, 'val22' from dual
)
, x as
(
  select x.*
  from xmltable('/Parameters/p'
       passing xmltype('<Parameters><p>2</p><p>3</p><p>4</p><p>5</p><p>10</p></Parameters>')                    
       columns p number(10) path '/') x
)
select t.*
from t, x
where t.id = x.p

...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919566
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,
Да.
Тут мне интересна архитектура - почему большой)))
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919573
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev

IMHO Жесть
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919575
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
) ну он десктоп вариант привел. Есть же пихают оракле типы в java сервер. Тоже жесть).
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919576
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

В реальной ситуации я бы написал конвейерную функцию читающую clob построчно,
каждый параметр в новую строку и никакого парсинга.

А вообще Oracle сам по себе жесть с какого ракурса не посмотри, имхо)))
...
Рейтинг: 0 / 0
Hibernate Repository, nativeQuery. передать массив как параметр запроса
    #39919586
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
А вообще Oracle сам по себе жесть
главное что на MS не похож))
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Repository, nativeQuery. передать массив как параметр запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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