Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Repository, nativeQuery. передать массив как параметр запроса / 25 сообщений из 35, страница 1 из 2
27.01.2020, 09:16
    #39918953
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Repository, nativeQuery. передать массив как параметр запроса
Добрый день.
Надо сделать что-то типа такого:

Код: 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
27.01.2020, 12:49
    #39919047
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Repository, nativeQuery. передать массив как параметр запроса
Павел Гужанов
Надо сделать что-то типа такого

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

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

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

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

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

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

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

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

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

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

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

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

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

Что на выходе получится?
...
Рейтинг: 0 / 0
28.01.2020, 10:03
    #39919318
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Repository, nativeQuery. передать массив как параметр запроса
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
28.01.2020, 10:08
    #39919321
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Repository, nativeQuery. передать массив как параметр запроса
Будет выполнена привязка списка значений к выражению вида
foo.bar in (:value_list).
...
Рейтинг: 0 / 0
28.01.2020, 11:32
    #39919354
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate Repository, nativeQuery. передать массив как параметр запроса
crutchmaster
Кидай ссылки, потому что я нахожу только костыли типа вот такого

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

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

Код: 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Repository, nativeQuery. передать массив как параметр запроса / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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