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


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