Spring boot, выполнить пользовательский запрос

0

Я новичок в веб-разработке, и я сделал несколько примеров, таких как получение данных из mysql db и их отображение на jsp-страницах (используйте CRUDRepository), но таким образом мы можем отображать только одни данные таблицы. что нам делать, если мы хотим показать комбинированные данные из двух таблиц.

Я нашел их во время поиска, просто я спрашиваю, как мы добавляем к этому более сложный sql-запрос.

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?? то опять же эта работа, потому что на самом деле нет такой таблицы.

  • 0
    Это слишком широко. Вам необходимо изучить JPA, ассоциации JPQL. Прочитайте документацию Hibernate или хорошую книгу об этом.
  • 0
    большое спасибо. что подсказка "JPQL" действительно помогла (я знаю, где искать). И сэр, если вы можете порекомендовать что-нибудь еще, оцените это.
Теги:
spring-boot
spring
spring-data-jpa
entity

1 ответ

0
Лучший ответ

Чтобы получить более сложные данные из БД, вы можете использовать прогнозы, например:

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 firstNameLengetFirstNameLen())

Точно так же вы можете получать данные от нескольких (соединенных) объектов.

Если у вас есть сущность с некоторыми ассоциациями, например:

@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 определения

Руководство пользователя Hibernate ORM

Справочник по языку JPQL

  • 0
    большое спасибо @ cepr0.
  • 0
    @ is_sa91, пожалуйста, но не забудьте принять / подтвердить ответ, если он вам помог)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню