Задать вопрос
hudrogen
@hudrogen

Как создать запрос в Spring Data Jpa с условием что поле равно null?

Есть репозиторий, один из методов выглядит примерно так
...
@Query(select data from Data data where data.sync =:sync)
List<Data> getDataBySync(@Param("sync") String sync);
...

Далее в менеджере репозитория есть метод, который вызывает метод репозитория
public void MethodName(Boolean sync){
    List<data> data = repository.getDataBySync(sync);
}

Если параметр sync true или false то все в порядке, возвращаются объекты у которых поле sync либо true либо false.
Но в случае если передавать null, то объекты не возвращаются, хотя в базе есть записи с полем sync == null
Как сделать так, чтобы при передаче null, возвращались объекты у которых поле sync == null ?
  • Вопрос задан
  • 2660 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
SQL не позволяет сравнивать что-либо с NULL. Поэтому так:
interface DaraRepository extends CrudRepository<Data, Long> {
    List<Data> findBySync(Boolean sync);
    List<Data> findBySyncIsNull();
}

Можно ещё так попробовать, но не знаю будет ли работать
import org.springframework.lang.Nullable;

interface DaraRepository extends CrudRepository<Data, Long> {
    List<Data> findBySync(@Nullable Boolean sync);
}

Не знаю зачем вы используете нестандартные имена методов репозитория и вручную пишите запросы, но если нужно, то выглядеть будет так
@Query("from Data data where data.sync is null")
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SergiiSl
а почему бы булевы данные не хранить в соответствующих типах:

@Query("select d from Data d where d.sync = ?1")
List<Data> getDataBySync(Boolean sync);

и кстати это слегка не SQL. Если есть желание писать SQL запрос, то следует в квери добавить native = true

Я так понимаю, что "null" в базе хранится в строковом виде у вас, а значит, оно никак не может соотноситься с null.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы