Arhn - архитектура программирования

Запрос данных Spring с нулевым Enum

У нас есть класс домена

@Entity
public class Gallery implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Enumerated(EnumType.ORDINAL)
    private Status status;

    // more attributes and getters/setters
}

Статус - это перечисление:

public enum Status {

    OPEN (0, "offen"),
    ACTIVE (1, "aktiv"),
    INACTIVE (2, "inaktiv");

    // attributes, constructor...
}

Затем у нас есть репозиторий Spring Data с запросом:

public interface GalleryRepository extends PagingAndSortingRepository<Gallery, Long> {

    @Query("SELECT g FROM Gallery g WHERE (:status IS NULL or g.status = :status)")
    public List<Gallery> findBySearchCriteria(@Param("status") Status status);
}

Цель (:status IS NULL or g.status = :status) заключается в том, что нам нужны все данные, когда статус не указан, и получить только соответствующие данные, когда статус задан.

Мы получаем результаты этого запроса, когда статус равен нулю, но мы не получаем никакого результата, если статус, например. АКТИВНО, хотя в базе есть данные со статусом=АКТИВНО.

Когда мы удаляем :status IS NULL or из запроса, мы получаем результаты, когда статус АКТИВЕН. Запрос выглядит так

public interface GalleryRepository extends PagingAndSortingRepository<Gallery, Long> {

    @Query("SELECT g FROM Gallery g WHERE (g.status = :status)")
    public List<Gallery> findBySearchCriteria(@Param("status") Status status);
}

Я позволяю регистрировать SQL и параметры, и когда я запускаю SQL (с :status IS NULL or) вручную, я получаю ожидаемые результаты:

Hibernate: select gallery0_.id as id1_13_, gallery0_.institution_id as institut5_13_, gallery0_.internName as internNa2_13_, gallery0_.name as name3_13_, gallery0_.selectedShortId_id as selected6_13_, gallery0_.status as status4_13_ from Gallery gallery0_ where ? is null or gallery0_.status=?
2014-09-10 09:54:49,531 TRACE type.descriptor.sql.BasicBinder: binding parameter [1] as [VARBINARY] - ACTIVE
2014-09-10 09:54:49,531 TRACE type.descriptor.sql.BasicBinder: binding parameter [1] as [VARBINARY] - ACTIVE
2014-09-10 09:54:49,535 TRACE type.descriptor.sql.BasicBinder: binding parameter [2] as [VARBINARY] - ACTIVE
2014-09-10 09:54:49,535 TRACE type.descriptor.sql.BasicBinder: binding parameter [2] as [VARBINARY] - ACTIVE

SQL

select gallery0_.id as id1_13_, gallery0_.institution_id as institut5_13_, gallery0_.internName as internNa2_13_, gallery0_.name as name3_13_, gallery0_.selectedShortId_id as selected6_13_, gallery0_.status as status4_13_ 
from Gallery gallery0_ 
where 1 is null or gallery0_.status=1

Когда мы используем другие типы данных (например, String), конструкция (например, (:name IS NULL or g.name = :name)) работает так, как ожидалось.

Что-то не так с этой конструкцией с перечислениями или это невозможно сделать в Spring Data/JPA?

Возможный обходной путь, который у нас есть, — писать в запросы, один со статусом, а другой без. В зависимости от того, является ли статус нулевым или нет, мы вызываем соответствующий метод в репозитории.


Ответы:


1

У меня была очень похожая проблема с параметрами Enum в весенних запросах данных, и мне удалось решить ее, используя вместо этого строки в запросах (сохраняя сопоставления сущностей как есть с Enums):

public interface GalleryRepository extends PagingAndSortingRepository<Gallery, Long> {

@Query("SELECT g FROM Gallery g WHERE (:status IS NULL or g.status = :status)")
    public List<Gallery> findBySearchCriteria(@Param("status") String status);
}
27.05.2015

2

Вы пытались просто создать запрос, используя имя метода?

public interface GalleryRepository extends JpaRepository<Gallery, Long> {
    public List<Gallery> findByStatus(Status status);
}
10.09.2014
  • Это не работает, потому что, когда статус равен нулю, этот метод находит все галереи со статусом = ноль. Но в данном случае нам нужны все Галереи, независимо от того, какой у них статус. Подсказка: в нашей системе запрос более сложный, с большим количеством атрибутов, которые можно установить или нет. Таким образом, запрос кажется подходящим решением. 10.09.2014

  • 3

    Вы можете попробовать это

    public interface GalleryRepository extends PagingAndSortingRepository<Gallery, Long> {
        @Query(value = "SELECT g FROM Gallery g WHERE (CAST(:status AS string) IS NULL OR g.status = :status)")
        List<Gallery> findBySearchCriteria(@Param("status") Status status);
    }
    

    Этот метод также работает для дат.

    04.12.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..