Как изобразить объединения с аннотацией @Query в методе Spring JPA Repository - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Spring-Boot с JPA и серверной частью MySQL.Теперь я запутался в репозиториях, которые предоставляет Spring-Boot.Я знаю, что они довольно мощные (и, кажется, весьма полезны, поскольку они могут значительно сократить ваш код).Тем не менее, я не понимаю, как представлять объединения в них, так как набор результатов должен быть комбинацией указанных атрибутов в выборе нескольких сущностей.

Теперь давайте предположим, что у нас есть три таблицы Book,Author, AuthorOfBook, где последний просто соединяет Book и Author с помощью комбинированного первичного ключа.Я думаю, у нас были следующие Java-классы:

Книга сущностей:

@Entity
@Table(name="BOOK")
public class Book {

  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "ID")
  private int id;
  @Column(name = "TITLE")
  private String title;

}

Автор сущности

@Entity
@Table(name="AUTHOR")
public class Author {

  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "ID")
  private int id;
  @Column(name = "LASTNAME")
  private String lastname;
  @Column(name = "FIRSTNAME")
  private String firstname;
  //Let's assume some getters and setters and a constructor
}

Entity AuthorOfBook:

@Entity
@Table(name="BOOK")
public class Book {
  @EmbeddedId
  private AuthorOfBookId pk;
}

Встроенный идентификатор

@Embeddable
public class AuthorOfBookId implements Serializable {
  private int authorId;
  private int bookId;
}

Репозиторий

@Repository
public interface AuthorOfBookRepository extends JpaRepository<,AuthorOfBookId> {

}

Теперь, как бы я представил этот запрос:

SELECT b.name, a.firstname, a.lastname from AuthorOfBook ab inner join Book b on b.id = ab.book_id inner join Author a on a.id = ab.author_id where a.lastname = :lastname;

в моем хранилище?Я знаю, что подпись должна быть как

@Query([the query string from above])
public (...) findAuthorAndBookByAuthorLastname(@Param("lastname") String lastname);

, но я не могу понять, на что будет похож тип возврата.Что этот метод возвращает?(просто AuthorOfBook не будет работать, я думаю)

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Если вы хотите обрабатывать поля аудита, вы можете сделать что-то вроде этого:

Класс аудита

@Embeddable
public class Audit {

    @Column(name = "created_on")
    private Timestamp createdOn;

    @Column(name = "updated_on")
    private Timestamp updatedOn;

    @Column(name = "is_deleted")
    private Boolean isDeleted;

    //getters and setters

    }

AuditListener для автоматического обновления полей аудита

public class AuditListener {

    private Long loggedUser = 1001L;

    /**
     * Method to set the fields createdOn, and isDeleted when an entity is persisted
     * @param auditable
     */
    @PrePersist
    public void setCreatedOn(Auditable auditable) {
        Audit audit = auditable.getAudit();

        if (audit == null) {
            audit = new Audit();
            auditable.setAudit(audit);
        }

        audit.setIsDeleted(Boolean.FALSE);
        audit.setCreatedOn(Timestamp.from(Instant.now()));
    }

    /**
     * Method to set the fields updatedOn and updatedBy when an entity is updated
     * @param auditable
     */
    @PreUpdate
    public void setUpdatedOn(Auditable auditable) {
        Audit audit = auditable.getAudit();
        audit.setUpdatedOn(Timestamp.from(Instant.now()));
    }
}

Идобавить это к сущностям

@EntityListeners(AuditListener.class)
public class Book implements Auditable {

    @Embedded
    private Audit audit;
0 голосов
/ 12 декабря 2018

Вы не хотите AuthorOfBook как отдельную сущность.Book должно иметь поле типа Author как отношение @ManyToOne.Таким образом, с учетом любого Book, вы можете найти детали автора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...