Nano Hash - криптовалюты, майнинг, программирование

Можно ли использовать объект Array в качестве параметра в аннотации Spring Repository @Query?

Можно ли использовать объект Array в качестве параметра в аннотации Spring Repository @Query?

Я пытаюсь получить все строки в таблице, чей узел столбца присутствует в массиве строк. Можно ли сделать это одновременно, используя аннотацию @Query в репозитории Spring?

Вот мой объект местоположения:

@Entity
@Table(name = "LOCATIONS")
public class Location extends Measurement{

    private String latitude;
    private String nsIndicator;

    private String longitude;
    private String ewIndicator;

    @ManyToOne
    @JoinColumn(name="node")
    private Node node;
}

Где node ссылается на класс Node, и он отображается в базе данных как BIGINT.

У меня есть такой репозиторий:

public interface LocationRepository extends CrudRepository<Location, Long>{

    @Query(value=
            "SELECT l1.node, l1.id, l1.latitude, l1.longitude " +
            "FROM LOCATIONS l1 WHERE l1.node IN (:ids)", 
            nativeQuery=true)
    List<Location> findMeasureByIds(@Param("ids") String[] ids);
}

Там вы можете увидеть запрос, который я пытаюсь выполнить, но он не работает. Я не знаю, можно ли там использовать массив, или параметры должны быть просто строками и/или целыми числами, я нигде не мог найти.

Я пробовал несколько комбинаций, таких как использование простой строки с правильным форматом или длинного массива... но пока ничего не сработало.

Заранее спасибо.

РЕШЕНИЕ:

@Query(value="SELECT * FROM LOCATIONS l1 " + 
             "INNER JOIN (SELECT node, MAX(id) AS id FROM LOCATIONS GROUP BY node) l2 " + 
             "ON l1.node = l2.node AND l1.id = l2.id " + 
             "WHERE l1.node IN :ids", nativeQuery=true) 
List<Location> findLastLocationByIds(@Param("ids") Set<Long> ids);

Я добавил больше функциональности в запрос, потому что мне нужно было получить последнюю строку, вставленную для каждого идентификатора узла. Итак, для этой работы есть функция MAX и ВНУТРЕННЕЕ СОЕДИНЕНИЕ.


Ответы:


1

Используйте коллекцию вместо массива (Set<String>) и убедитесь, что она не пуста (иначе запрос будет недействительным.

Кроме того, нет причин использовать для этого собственный запрос, и у вас не должно быть круглых скобок вокруг параметра:

@Query("SELECT l1 FROM Location l1 WHERE l1.node.id IN :ids")
List<Location> findLocationsByNodeIds(@Param("ids") Set<String> ids);
08.04.2014
  • Большое спасибо! Это то, что я искал. Я использовал Set‹Long›, потому что мой класс Node Java объявляет идентификатор как длинный. Я отредактировал вопрос, чтобы включить решение. Я использую nativeQuery, потому что мне нужно использовать функцию агрегации MAX с INNER JOIN, и я не знаю, возможно ли это сделать без опции nativeQuery. Спасибо еще раз! 08.04.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..