Spring boot JPA - Невозможно получить вложенные ресурсы, разбитые на страницы - PullRequest
0 голосов
/ 12 марта 2019

У меня есть 2 сущности - Тема и Запись . Тема имеет много сообщений с. У каждого объекта есть хранилище, и для каждого из них работает базовая функциональность CRUD.

Моя проблема: Я не могу найти способ получить нумерованную коллекцию из сообщений , связанных с определенной темой .

Конечно, я могу получить Thread по идентификатору, и он также появляется в сообщениях ... но это не подходит моему сценарию использования. Например, если в теме было 60 сообщений, я должен иметь возможность разбивать результаты на страницы. Это заставляет меня чувствовать, что мне следует напрямую звонить в PostRepository и запрашивать только сообщения с определенным идентификатором темы.

Это привело меня к следующему методу запроса в моем PostRepository:

    @Query("SELECT p FROM Post p " +
        "JOIN Thread AS t " +
        "ON p.thread.id = t.id " +
        "WHERE t.id = :threadId")
Page<Post> findPostsByThreadId(@Param("threadId") long threadId, Pageable pageable);

К сожалению, это ничего не возвращает. (Стоит отметить, что сообщения были были сохранены - я просто не могу запросить их таким образом).

Ниже я покажу основное представление моих сущностей:

@Entity
@Table(name = "thread")
public class Thread {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

private String state;

@OneToMany
private List<Post> posts;


public Thread() { }

@PrePersist
public void prePersist() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    posts = new ArrayList<>();
    state = "OPEN";
}

@PreUpdate
public void preUpdate() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
}

public void submitPost(Post newPost) {
    posts.add(newPost);
}

public Long getThisId() {
    return id;
}

public List<Post> getPosts() {
    return posts;
}

public void setPosts(List<Post> posts) {
    this.posts = posts;
}

public String getState() {
    return state;
}

public void setState(String state) {
    this.state = state;
}
}


@Entity
@Table(name = "posts")
public class Post extends ResourceSupport {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

private String postText;

@ManyToOne
private Thread thread;

public Post() { }

public Long getThisId() {
    return id;
}

public Thread getThread() { return thread; }

public String getPostText() {
    return postText;
}

public void setPostText(String postText) {
    this.postText = postText;
}

public void setThread(Thread thread) {
    this.thread = thread;
}
}

Я довольно новичок в JPQL, поэтому могу ошибаться.

Есть идеи, что я здесь не так делаю?

1 Ответ

0 голосов
/ 13 марта 2019

Хотя это и не отвечает первоначальной проблеме, стоит упомянуть, что вам НЕ нужно вручную создавать этот запрос. Все, что вам нужно, это определить имя метода в вашем интерфейсе репозитория (используя надлежащие соглашения об именах) и позволить JPA сделать все остальное:

Page<Post> findAllByThreadId(@Param("threadId") long threadId, Pageable pageable);

Меньше кода: меньше шансов ошибиться.

Если вы также используете Data Rest, он также автоматически создаст для него соответствующую конечную точку REST.

...