Spring Boot: добавляем 'лайки', используем HQL (JPQL)

preview_player
Показать описание
Spring Boot Web Application (MVC): добавляем в наше приложение "лайки" (отметки "мне нравится) с использованием Hibernate HQL (JPQL) - язык запросов, оперирующий не таблицами, а доменной моделью приложения, оформленной с использованием JPA

Код из видео:

Для отображения лайков нам потребуется немного дополнить нашу доменную модель через добавление JPA связи ManyToMany между сущностями Message и User. Также нам потребуется добавить новую SQL миграцию Flyway, в которой мы опишем создание данной связи. После этого необходимо доработать шаблоны Freemarker для отображения иконки "сердечко", взятой из библиотеки FontAwesome, и немного доработать оформление Bootstrap компонентов. Для того, чтобы при клике на сердечно ставились или снимались отметки "мне нравится", мы добавим дополнительный эндпойнт (http мэппинг) в наш контроллер сообщений

Документация по Spring Data JPQL:

Документация по Hibernate ORM HQL:

Выравнивание блоков в Bootstrap:

Страница проекта Font Awesome:

Видео Sweater Many2Many:

Видео с разбором проекта Lombok:

Видео с разбором проекта Google Guava:

Видео про подключение миграций Flayway:

➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖

➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖

Поддержать проект:

➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖

Рекомендации по теме
Комментарии
Автор

Автору огромное спасибо! Поддерживаю остальных - не бросай канал!

Degebery
Автор

Автору респект и лукас. Ошибочка при добавлении нового сообщения, решается возвращением "redirect:/main" вместо "main" (еще лучше как в методе like сделать). Кто-то умный кстати писал, в чате автора в телеге, что любое изменение в базе должно заканчиваться редиректом.

TheSaymonFenix
Автор

Спасибо!
Мозгодробительный урок.
Для тех, кто как и я новичок:
Были сложности с методе add. Падало добавление нового сообщения. С помощью комментариев к видео сложность была решена с помощью редиректа;
Вторая сложность лайки. messageRepo.save(). Без этого метода ничего не лайкалось)

AnnaSmirnova
Автор

Как ни странно работает без ошибок)) Я еще учусь, поэтому долго разбираюсь в некоторых моментах, и выводы такие: то ли я очень внимательный, то ли чему-то научился к концу плейлиста)) Большое спасибо за ваш труд!)

sc-ntgr
Автор

Уроки супер. Подача огонь. заставил поломать голову момент с лайками(отображало не как у автора), но благодаря этому почитал код более детально. Dru, огромное спасибо за труд.

ssycccy
Автор

Чтобы после добавления сообщения шаблонизатор не крэшился нужно те же изменения что были сделаны
в методе main() класса MainController (он же MessageController), сделать в MainController, в методе
@PostMapping("/main")
public String add(...)

А именно -

(1) добавить в MainController.add() параметр
@PageableDefault(sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable

(2) заменить в этом же методе строки
Iterable<Message> messages = messageRepo.findAll();
model.addAttribute("messages", messages);

на

model.addAttribute("url", "/main");
Page<Message> page = this.messageService.messageList(pageable, ""); // пустой фильтр
model.addAttribute("page", page);

Booruvcheek
Автор

мега-мега круто!!! Присоединяюсь к панде =)

IvanIvanov-oinx
Автор

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

byjbltx
Автор

Как всегда всё доходчиво и понятно!
Интересно посмотреть как работает "Планировщик задач" с настройками из БД

jmlbfds
Автор

Банда привет всем! :) Дрю, спасибо за труды!

artsbrand
Автор

Жду новых видосиков :*
Слежу в чате :D

romoshi
Автор

Можете пожалуйста реализовать отдельный микросервис для аутентификации ( по oAuth2.0) с использованием JWT токенов?

AZwaz
Автор

Отличный, понятный контент. Видео курс по линуксу пожалуйста!)

pnvphdd
Автор

Very cool video.
Debug session with EntityManager is very cool!

narimo
Автор

Блиннн, почему такие важные моменты как работа с базой через idea проскакиваются без всяких комментариев? Как это открылось, как поменялось? А если не подключилась база в idea ?

Sergei-kqhk
Автор

Спасибо! Отличный и лаконичный материал!

D.P._
Автор

Супер уроки! Подача материала просто космос, есть с чем сравнить - там где автор раскрывает тему за 10 минут другие тянут резину по 2 часа... В ходе обучения возник вопрос - как поступить если нам нужно сохранить через контроллер не одно поле в таблице БД а множество полей? Ловить в @RequestParam лист объектов?

lxixciy
Автор

Может кому пригодится в запросе @Query("from Message m where m.author = :author"), нужно двоеточие прилепить к переменной (:author), или получите - Named parameter not bound : author; nested exception is org.hibernate.QueryException: Named parameter not bound : author

ebwfsln
Автор

Привет. Классный ролик. А в ближайшей перспективе нет создания роликов по Thymeleaf? И вообще, для реальных проектов достаточно FreeMarker'a? Или лучше бы знать Thymeleaf?

global_silence
Автор

Спасибо за урок все супер но как всегда вопрос почему нельзя запрос сделать проще
"case when ml = :user then true else false end"
без sum и сравнения?
и еще вопрос почему @PathVariable Message message выбрасывает ошибку " class java.lang.Long, got class java.lang.Integer" Failed to convert а Usera без проблем находит

alexandrguravskiy