Необязательное добавление параметров в собственный запрос Spring Data JPA

Я использую Spring Data JPA с собственными запросами, как показано ниже.

public interface ItemRepository extends JpaRepository<ItemEntity, Long> {

  @Query(value = "select * from items i where i.category = :itemCategory and i.item_code = :itemCode", nativeQuery = true)
  Page<ItemEntity> search(@Param("itemCategory") String itemCategory, @Param("itemCode") String itemCode, Pageable pageable);
}

Теперь мой вариант использования

  1. Он itemCode доступен, следует вернуть только товар с этим кодом из этой категории.
  2. Но если itemCode недоступен, то все элементы в этой категории должны быть возвращены.

Таким образом, проблема с вышеуказанной категорией заключается в том, что когда itemCode передается как NULL, данные не возвращаются, поскольку они ничему не соответствуют. тогда как требование заключается в том, что его следует игнорировать.

Итак, есть ли способ дополнительно добавить предложение в собственный запрос Spring Data JPA. Я знаю, что это возможно с CriteriaQuery, но можем ли мы сделать что-то подобное для нативных запросов?

Спасибо


person Meena Chaudhary    schedule 05.09.2019    source источник
comment
Посмотрите на использование расширения querydsl. Это позволит вам звонить по категории, коду или категории и коду без необходимости писать какие-либо реализации запроса.   -  person Alan Hay    schedule 05.09.2019


Ответы (2)


Да, это возможно и с собственным запросом. Очень хорошее объяснение здесь, прочитайте это

#Подход1

@NamedQuery(name = "getUser", query = "select u from User u"
            + " where (:id is null or u.id = :id)"    
            + " And :username"

:itemCode is null or i.item_code = :itemCode

#Подход2

# UserDao.java 

  public User getUser(Long id, String usename) {
        String getUser = "select u from user u where u.id " + Dao.isNull(id) 
                       + " And u.username " + Dao.isNull(username);
        Query query = Dao.entityManager.createQuery(getUser);
    }

# Dao.java

   public static String isNull(Object field) {
        if (field != null) {
                if (field instanceof String) {
                    return " = " + "'" + field + "'";
                } else {
                    return " = " + field;
                }

            } else {
                return " is NULL ";
            }
    }

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

person Maheshwar Ligade    schedule 05.09.2019

Просто измените условие where

i.item_code = :itemCode

to

:itemCode is null or i.item_code = :itemCode
person e.g78    schedule 05.09.2019
comment
Это не то, о чем спрашивают. - person Alan Hay; 05.09.2019
comment
простите, а почему бы и нет? - person e.g78; 05.09.2019
comment
Если переданный параметр имеет значение null, игнорируйте его, иначе верните соответствие. Ваш ответ делает что-то совершенно другое. По сути, не добавляйте условие i.item_code = :itemCode, если его параметр равен null. - person Alan Hay; 05.09.2019