Как заставить JPA @query работать с проекцией, в которой есть другая проекция - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь получить проекции на @query в JPA с объединенными столбцами в качестве еще одного проекта.

Скажем, у меня есть 2 сущности: курс, и студент, и студент могут иметь много курсов ивнешний ключ находится на столе курса:

student(id, name, email, age, grade, uuid)

course(id, name, uuid, student_id)

И у меня есть такие прогнозы:

public interface CourseProjection {
  UUID getUuid();
}

И,

public interface StudentProjection {
  String getName();
  String getEmail();
  Set<CourseProjection> getCourses();
}

В сущности:

public class Student {
    // other code
    @OneToMany(mappedBy = "student")
    private Set<Course> courses = new LinkedHashSet<>();
}

Мне нужно выполнить LIKE поиск по нескольким столбцам, включая курс UUID.Мне тоже нужно, я тоже хочу нумерацию страниц.Итак, в хранилище я хочу сделать что-то вроде:

@Repository
interface StudentRepository extends JpaRepository<Student, UUID> {
  @Query(
     value = "SELECT * FROM student s LEFT JOIN courses c ON s.id = 
     c.student_id WHERE s.name LIKE %str% OR c.student_id::text LIKE %str%",
     nativeQuery = true
  )
  Page<StudentProjection> findAllByKeyword(String keyword, Pageable pageable);
}

Я хочу, чтобы результат выглядел следующим образом:

[
  {
    name: John
    email: johndoe@gmail.com
    courses: [
      "course_uuid_1",
      "course_uuid_2"
    ]
  }
  {
    ...
  }
]

Есть предложения о том, как этого добиться?

1 Ответ

0 голосов
/ 25 апреля 2019

Есть ли у вас попробовать:

  1. интерфейс StudentRepository расширяет JpaRepository, excerptProjection = projectionName.class Чтобы усилить эту проекцию в хранилище.

  2. Https: домен / contextpath / студентов / поиск / findAllByKeyword проекция = projectionName? Чтобы применить прогноз для этого отдыха API. И вам нужно добавить больше конфигурации, как показано ниже:

     @Configuration
     public class RepositoryConfig extends RepositoryRestConfigurerAdapter {
         @Override
         public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {   
    
              config.getProjectionConfiguration().addProjection(projectionName.class));  
    
         }
     }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...