Я новичок в веб-разработке, и я сделал несколько примеров, таких как получение данных из mysql db и их отображение на jsp-страницах (используйте CRUDRepository), но таким образом мы можем отображать только одни данные таблицы. что нам делать, если мы хотим показать комбинированные данные из двух таблиц.
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.lastname like ?1%")
List<User> findByAndSort(String lastname, Sort sort);
@Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")
List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);
}
если мы можем поставить этот сложный запрос (например, три таблицы или более) здесь, должен ли мы создать новый класс сущности согласно запросу coloumns?? то опять же эта работа, потому что на самом деле нет такой таблицы.
Чтобы получить более сложные данные из БД, вы можете использовать прогнозы, например:
public interface UserProjection {
Long getId();
Long getFirstNameLen();
}
@Query("select u.id as id, LENGTH(u.firstName) as firstNameLen from User u where u.lastname like ?1%")
List<UserProjection> getProjections(String lastName, Sort sort);
Обратите внимание, что вы должны использовать псевдонимы в запросе, которые должны совпадать с геттерами в проекции (... as firstNameLen
→ getFirstNameLen()
)
Точно так же вы можете получать данные от нескольких (соединенных) объектов.
Если у вас есть сущность с некоторыми ассоциациями, например:
@Entity
public class User {
//...
@OneToMany
private List<Role> roles;
}
то вы можете использовать метод репозитория, чтобы получать данные о пользователях и их ролях даже без какой-либо проекции, только для основного объекта (User
). Тогда Весна сама остальная часть работы:
@EntityGraph(attributePaths = "roles")
List<User> findByFirstNameContainingIgnoreCase(String firstName);
или же с запросом:
@Query("select distinct u from User u left join fetch u.roles where upper(p.firstName) like concat('%', upper(?1), '%')")
List<User> findWithQuery(String firstName);
В этом случае все пользователи будут иметь список своих ролей, заполненных данными из таблицы roles
.
(Обратите внимание, чтобы использовать distinct
в запросе, чтобы предотвратить результат из дублированных записей, подробнее см здесь.)
Полезные ресурсы:
Spring Data JPA - Справочная документация
Поддержка Spel в Spring Data JPA @Query определения