Поиск по НЕ текущей строке

#java #spring-boot #spring-data-jpa

#java #spring-boot #spring-data-jpa

Вопрос:

Я разрабатываю небольшую cms, и я использую spring data jpa ее для работы с базой данных.

Когда я добавляю новую страницу, я хочу убедиться, что пуля еще не существует, для этой цели я добавил метод в свой репозиторий:

 public interface PageRepository extends JpaRepository<Page, Integer> {

    Page findBySlug(String slug);

}
 

Это отлично работает при добавлении.

Однако при редактировании страницы я хочу проверить, что пуля еще не существует, но НЕ для текущей страницы, как я могу это сделать? Я думаю, я мог бы каким-то образом передать текущий идентификатор строки или что-то в этом роде, но как мне это сделать?

Комментарии:

1. вы можете написать пользовательский запрос JPQL, если вы не можете сделать это с помощью DSL

2. вы хотите проверить: ВЫБЕРИТЕ * со страниц, КОТОРЫХ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ slug со страниц p)?? Итак, вы хотите проверить, есть ли в вашей таблице страниц какая-либо строка, содержащая переменную slug?

3. Я надеялся, что это возможно с помощью какой-то автоматической программы без JPQL

4. Возможно, поле флага в сущности страницы? Отредактировано? Просто бессвязно.

5. Если вы используете spring-data-rest , вы можете выполнить проверку в @HandleBeforeSave обработчике

Ответ №1:

Вы можете написать

 Page findBySlugAndIdNot(String slug,Long id)
 

где id — это имя вашего идентификатора в сущности с правильным типом. Посмотрите документацию

Ответ №2:

вы можете попробовать пользовательский запрос, например :

 @Query("SELECT CASE WHEN COUNT(c) > 0 THEN true ELSE false END FROM Page p WHERE p.slug = :slug and p.pageId!=pageId")
public boolean existsBySlugInPage(@Param("slug") String slug, @Param("pageId") Integer pageId);