JPA нулевые параметры - PullRequest
0 голосов
/ 24 марта 2020

Мне нужно выбрать все строки, которые соответствуют параметру, или получить все из них, если он равен нулю

Я (не) нашел решение, читающее документацию Spring Data - Пример 21. Использование различных ограничений обнуляемости

Попробовал пример с использованием аннотации @Nullable, но все еще не работает, вот код

// just a part of entity LotMaster 
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "lot_master_gen")
@SequenceGenerator(name = "sq_lot_master_gen", sequenceName = "sq_lot_master", allocationSize = 1)
@Column(name = "lot_id")
private Long id;

//repository extends JpaRepository<LotMaster, Long>
@Nullable
Page<LotMaster> findAllById(@Nullable Long id, Pageable p);

Запрос:

SELECT
   *
FROM
   (
      SELECT
         lot0_.lot_id              AS lot1_2_,
         lot0_.qty                 AS qty_2_,
         lot0_.version             AS version8_2_,
         lot0_.username            AS username15_2_
      FROM
         lot_master lot0_
      WHERE
         lot0_.lot_id IS NULL
   )
WHERE
   ROWNUM <= ?

Как вы видите, он использует нулевое значение в качестве условия вместо игнорирования его

Pi c Документация

Как это возможно? Любая идея без CriteriaApi или использования @ Query Моя идея состоит в том, чтобы добавить еще несколько параметров и использовать производный запрос

Возможно, связанный DATAJPA-209

Я понимаю, что использование id в качестве примера сбивает с толку, извините за это. Однако, если я использую другое поле, такое как qty, у меня должна быть возможность поиска даже с нулем. В форме несколько полей, которые можно оставить empy. Было бы неплохо реализовать, например, @RequestParam с обязательными параметрами или параметрами defaultValue или просто @Nullable, работающие

1 Ответ

0 голосов
/ 24 марта 2020

Вам нужно будет findAllByIdOrId(@Nullable Long id, Long id2) и передать null в качестве одного из параметров. Вид скучно и проще с @Query.

Другой подход - сделать findAllByIdOrIdIsNull(Long id), но это будет

...