2017-02-14 25 views
1

Я имею следующую функцию в одном из своих хранилищ:Spring Data (REST) ​​и @Query: необязательный список, как пары

@RestResource(path = "filter", rel = "filter") 
@Query("SELECT t " 
     + "FROM Trip t " 
     + "WHERE " 
     + "(:from IS NULL OR t.startTs >= :from) " 
     + "AND (:categories IS NULL OR t.category IN :categories) ") 
Page<Trip> filter(
     @Param("from") Instant from, 
     @Param("categories") List<Category> categories, 
     Pageable pageable); 

Category это перечисление, которое хранится в

@Enumerated(EnumType.STRING) 

в таблице Trips.

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

htt*://localhost/filter?categories=PRIVATE ==> нормально

htt*://localhost/filter ==> нормально

При использовании более одной категории:

htt*://localhost/filter?categories=PRIVATE,BUSINESS 

Я получаю следующее исключение:

org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный АСТ node: {vector} [select count (t) FROM foo.bar.services.trips.model.Trip t WHERE (: from IS NULL ИЛИ t.startTs> =: from) AND (: categories_0_, : categories_1_ IS NULL ИЛИ t.category IN (: categories_0_, : categories_1_))]

Кто-нибудь имеет представление о том, что я делаю неправильно здесь?

ответ

1

Выполните одно из следующих действий:

1) Try приложить заявления с участием списка в скобках:

@Query("SELECT t " 
     + "FROM Trip t " 
     + "WHERE " 
     + "(:from IS NULL OR t.startTs >= :from) " 
     + "AND ((:categories IS NULL) OR (t.category IN :categories)) ") 

2) заключите: категории в скобках здесь

t.category IN (:categories) 
+1

Пробовал оба, но не работал. Но ты указал мне в правильном направлении. Это то, что в конечном итоге работает: AND ((: categories) IS NULL OR (t.category IN (: categories)). Thx! – StephanM

+0

Отлично! –